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。

如何解决这个问题?

MVC Web API autofacc依赖注入

您的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...