Autofac PerRequest WebApi 2 + Owin

时间:2017-06-19 14:51:52

标签: asp.net-web-api2 owin autofac

尝试使用我的WebApi实现autofac ......但是对于我的对象有一些生命周期问题......

我的启动webapi课程:

var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).InstancePerRequest();

    container.RegisterType<MyConcreteClass>().As<IMyInterface>().InstancePerRequest();

    var container = builder.Build();

    app.UseAutofacMiddleware(container);
    app.UseAutofacWebApi(config);


    var csl = new AutofacServiceLocator(container);
    ServiceLocator.SetLocatorProvider(() => csl);


    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

但不起作用

无法解析“IMyInterface”类型,因为无法找到它所属的生命周期范围。此注册公开了以下服务: - IMyInterface

详细信息---&gt;从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。

如果您在执行Web应用程序期间看到这一点,它通常表示SingleInstance()组件(或类似方案)正在请求注册为每HTTP请求的组件。在Web集成下,始终从依赖项解析程序或请求生存期范围请求依赖项,而不是从容器本身请求。 (详见内部异常。)

删除此部分 .InstancePerRequest(); ,然后正常工作,但该对象未处理。

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

我强烈怀疑问题出在以下代码中:

var csl = new AutofacServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => csl);

错误消息表明必须使用依赖项解析程序解决依赖关系,但这会绕过它并使用容器本身。

  

在旁注上,使用service locator is anti-pattern。您应该将依赖项注入控制器和其他MVC扩展点,而不是使用此方法。