首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac属性注入在属性上失败

Autofac属性注入在属性上失败
EN

Stack Overflow用户
提问于 2013-07-28 16:15:23
回答 2查看 10.7K关注 0票数 14

我发现了一些关于这方面的问题,但它们往往指向我正在遵循的确切文档……但它仍然不起作用。

我正在构建一个相当简单的ASP.NET MVC4站点,计划使用ActionFilterAttribute-based日志记录。我有一个使用数据库打开事务并提供工作单元实例的DataAccessProvider类,我正在尝试将它注入到过滤器属性中。

documentation说,只需调用RegisterFilterProvider()就足够了,并确保注册了相关类型。它特别说明了不需要注册该属性,但我已经尝试了with和with。我的代码目前看起来像这样:

代码语言:javascript
复制
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());

builder.Register(x => new EntityAccessProvider())
    .As<IDataAccessProvider>()
    .InstancePerHttpRequest();

builder.RegisterType<DebugLogAttribute>().PropertiesAutowired();
// ^ I've tried it with and without this line

builder.RegisterFilterProvider();
var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

文档中的示例只是在过滤器上放置了一个属性,所以我也做了同样的事情:

代码语言:javascript
复制
public class DebugLogAttribute : ActionFilterAttribute
{
    private IDataAccessProvider DataAccess { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext) { ... }
    public override void OnActionExecuted(ActionExecutedContext filterContext) { ... }
}

文档说这就是所需要的一切--甚至不需要一个要注入的构造函数;它是通过属性注入完成的。但是,当我运行这段代码时,DataAccess属性始终为null;Autofac似乎忽略了它。我知道注册工作正常,因为它正确地将EntityAccessProvider注入到我的控制器中,但它不能用于属性。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-28 16:40:02

您的IDataAccessProvider类型的属性必须是公共,注入才能工作。如果您愿意,您仍然可以将DebugLogAttributeIDataAccessProvider及其实现标记为内部。

代码语言:javascript
复制
[DebugLogAttribute]
public class HOmeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

internal class DebugLogAttribute : ActionFilterAttribute
{
    public IDataAccessProvider DataAccess { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Debugger.Break();
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Debugger.Break();
    }
}

internal interface IDataAccessProvider {}

internal class DataAccessProvider:IDataAccessProvider {}
票数 14
EN

Stack Overflow用户

发布于 2019-04-09 07:14:49

我在asp dotnet核心中也遇到了同样的问题,但目前的解决方案(公开)似乎不起作用。我发现奇怪的是,下面的评论是关于web-api的,但我使用的是普通的ASP.NET核心MVC (MVC6)。因此,如果有人有同样的问题,请尝试下面的解决方案。

https://docs.autofac.org/en/latest/integration/webapi.html#standard-web-api-filter-attributes-are-singletons

与MVC中的筛选器提供程序不同,Web API中的筛选器提供程序不允许您指定不应缓存筛选器实例。这意味着Web API中的所有筛选器属性实际上都是在应用程序的整个生命周期中存在的单个实例。

代码语言:javascript
复制
public override async Task OnActionExecutionAsync(
            ActionExecutingContext context,
            ActionExecutionDelegate next)
        {
            MyService = context.HttpContext.
                               RequestServices.GetService(typeof(IMyService)) as IMyService;
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17906329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档