我将Autofac设置为自动注入控制器构造函数中的依赖项,但现在我需要手动解析函数中的依赖项(DBcontext
),我无法将上下文作为构造函数传递参数。
将Container设置为公共静态变量并访问它而不是通过Startup.Container.Resolve<DbContext>()
是不好的做法?
修改
我刚刚发现了这段代码:
AutofacDependencyResolver.Current.ApplicationContainer.Resolve<MyDbContext>();
这是正确的使用方法吗?因为它只获取当前的Container然后结算?
答案 0 :(得分:2)
通常认为引用静态属性或方法来检索全局容器或解析依赖关系是不好的做法,因为您将代码耦合到Autofac,以后当您需要重构或测试时可能会对您造成伤害。代码。
既然你提到它是一个已经耦合到MVC的属性过滤器(我推测),你可以使用DependencyResolver.Current
。为此,您需要在启动代码中设置AutofacDependencyResolver
。
为了减少耦合,您还可以解决过滤器构造函数中的依赖关系,如下所示:
class MyFilter: ActionFilterAttribute
{
private readonly DbContext _context;
public MyFilter(): this(null)
{
}
internal MyFilter(DbContext context)
{
_context = context ?? DependencyResolver.Current.GetService<DbContext>();
}
}
这样你的方法耦合较少,你可以使用内部构造函数轻松测试方法。
更新 RegisterFilterProvider
当然是更好的解决方案,因为您不需要DependencyResolver.Current
。