MVC Web API autofacc依赖注入
本文关键字:依赖 注入 autofacc API Web MVC | 更新日期: 2023-09-27 18:14:49
在我的设置类我有以下代码(使用Autofac和MVC Web API模板在Visual Studio)
builder.RegisterType<CRMUserStore<IdentityUser>>().As<IUserLoginStore<IdentityUser>>()
.InstancePerRequest();
然后在Startup。在这个类中,我有下面的
UserManagerFactory = () => new UserManager<IdentityUser>(
DependencyResolver.Current.GetService<IUserLoginStore<IdentityUser>>());
返回null。然后当我尝试代替上面的
UserManagerFactory = () => new UserManager<IdentityUser>(
_container.Resolve<IUserLoginStore<IdentityUser>>()); //_container is IContainer
我得到一个错误说
类型为"autoface . core"的异常。在autoface .dll中发生了DependencyResolutionException,但未在用户代码中处理
附加信息:在请求实例的作用域中,没有标记匹配'AutofacWebRequest'的作用域可见。这通常表明,SingleInstance()组件(或类似的场景)正在请求按http请求注册的组件。在web集成中,总是从DependencyResolver请求依赖项。当前或ILifetimeScopeProvider。
如何解决这个问题?
您的IUserLoginStore
服务被注册为InstancePerRequest
,这意味着它只能从请求的上下文中解析。例如,一个生命周期范围标记为'AutofacWebRequest'。
AutoFac自动为每个请求创建一个标记为"AutofacWebRequest"的新生存期范围,因此在请求内解析的服务可以访问这个标记的范围。我会想象Startup.Auth
类在MVC应用程序的范围和任何特定请求之外运行。因此,它不能访问标记的作用域,因此会出现No scope with a Tag matching 'AutofacWebRequest'
异常。
如果是这种情况,那么将IUserLoginStore
注册更改为InstancePerLifetimeScope
将允许它在Startup.Auth
类中正确解析。
然而,这也会改变在请求内解析时的行为,以始终获得应用程序作用域的服务。如果没有看到更多的代码,我无法判断这是否会是一个问题。
这里有一个相关的问题,写得很好:Autofac - InstancePerHttpRequest vs InstancePerLifetimeScope
注意 -确保您已配置Asp。. Net MVC使用AutoFac进行依赖解析,如AutoFac文档(https://code.google.com/p/autofac/wiki/MvcIntegration)所述。
protected void Application_Start() {var builder = new ContainerBuilder();builder.RegisterControllers (typeof (MvcApplication) .Assembly);var container = builder.Build();DependencyResolver。SetResolver(新AutofacDependencyResolver(容器));
// Other MVC setup...