【问题标题】:MVC Web API AutoFac Dependency InjectionMVC Web API AutoFac 依赖注入
【发布时间】:2014-07-25 07:08:21
【问题描述】:

在我的设置类中,我有以下代码(在 Visual Studio 中使用 Autofac 和 MVC Web API 模板)

builder.RegisterType<CRMUserStore<IdentityUser>>().As<IUserLoginStore<IdentityUser>>()
    .InstancePerRequest();

然后在 Startup.Auth 类中我有以下内容

UserManagerFactory = () => new UserManager<IdentityUser>(
    DependencyResolver.Current.GetService<IUserLoginStore<IdentityUser>>());

这将返回空值。然后当我尝试而不是上面的时候

UserManagerFactory = () => new UserManager<IdentityUser>(
    _container.Resolve<IUserLoginStore<IdentityUser>>()); //_container is IContainer

我收到一个错误提示

Autofac.dll 中出现“Autofac.Core.DependencyResolutionException”类型的异常,但未在用户代码中处理

附加信息:从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net-web-api dependency-injection autofac


    【解决方案1】:

    您的IUserLoginStore 服务被注册为InstancePerRequest,这意味着它只能在请求的上下文中解决。 IE。标记为“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) 中所述。

    受保护的 void Application_Start() { var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

    // Other MVC setup...
    

    【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多