14

我发现了一些关于此的问题,但它们往往指向我正在关注的确切文档......但它仍然无法正常工作。

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

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

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));

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

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到我的控制器中,但它不适用于属性。我错过了什么?

4

2 回答 2

14

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

[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 {}
于 2013-07-28T08:40:02.080 回答
1

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

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

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

public override async Task OnActionExecutionAsync(
            ActionExecutingContext context,
            ActionExecutionDelegate next)
        {
            MyService = context.HttpContext.
                               RequestServices.GetService(typeof(IMyService)) as IMyService;
        }
于 2019-04-08T23:14:48.663 回答