我发现了一些关于这方面的问题,但它们往往指向我正在遵循的确切文档……但它仍然不起作用。
我正在构建一个相当简单的ASP.NET MVC4站点,计划使用ActionFilterAttribute-based日志记录。我有一个使用数据库打开事务并提供工作单元实例的DataAccessProvider类,我正在尝试将它注入到过滤器属性中。
documentation说,只需调用RegisterFilterProvider()就足够了,并确保注册了相关类型。它特别说明了不需要注册该属性,但我已经尝试了with和with。我的代码目前看起来像这样:
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注入到我的控制器中,但它不能用于属性。我遗漏了什么?
发布于 2013-07-28 16:40:02
您的IDataAccessProvider类型的属性必须是公共,注入才能工作。如果您愿意,您仍然可以将DebugLogAttribute、IDataAccessProvider及其实现标记为内部。
[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 {}发布于 2019-04-09 07:14:49
我在asp dotnet核心中也遇到了同样的问题,但目前的解决方案(公开)似乎不起作用。我发现奇怪的是,下面的评论是关于web-api的,但我使用的是普通的ASP.NET核心MVC (MVC6)。因此,如果有人有同样的问题,请尝试下面的解决方案。
与MVC中的筛选器提供程序不同,Web API中的筛选器提供程序不允许您指定不应缓存筛选器实例。这意味着Web API中的所有筛选器属性实际上都是在应用程序的整个生命周期中存在的单个实例。
public override async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next)
{
MyService = context.HttpContext.
RequestServices.GetService(typeof(IMyService)) as IMyService;
}https://stackoverflow.com/questions/17906329
复制相似问题