Dependency injection 带有DbContext的简单注入器作用域

Dependency injection 带有DbContext的简单注入器作用域,dependency-injection,simple-injector,Dependency Injection,Simple Injector,我用的是简单的注射器 我有一个mvc项目,它也有ApicController 以下是我的设置: public static class SimpleInjectorWebApiInitializer { /// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary> public static void Initialize()

我用的是简单的注射器

我有一个mvc项目,它也有ApicController

以下是我的设置:

 public static class SimpleInjectorWebApiInitializer
{
    /// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
    public static void Initialize()
    {
        var container = new Container();
        container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

        InitializeContainer(container);

        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
        // This is an extension method from the integration package.
        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        container.Verify();

        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
       // GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
    }

    private static void InitializeContainer(Container container)
    {
        container.Register<DbContext, CoreContext>(Lifestyle.Scoped);
        container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
    }
}
公共静态类SimpleInjectorWebAPI初始值设定项
{
///初始化容器并将其注册为Web API依赖项解析器。
公共静态void Initialize()
{
var container=新容器();
container.Options.DefaultScopedLifestyle=新的AsyncScopedLifestyle();
初始化容器(容器);
容器.RegisterWebApp控制器(全局配置.Configuration);
//这是集成包中的扩展方法。
container.RegisterMvcControllers(Assembly.getExecutionGassembly());
container.Verify();
SetResolver(新的SimpleInjectDependencyResolver(容器));
//GlobalConfiguration.Configuration.DependencyResolver=新的SimpleInjectorWebAPI DependencyResolver(容器);
}
私有静态void InitializeContainer(容器)
{
容器。寄存器(生活方式。范围);
容器。寄存器(生活方式。范围);
}
}
但是,这给了我一个错误:

配置无效。出现以下诊断警告 报道: -[生活方式不匹配]UnitOfWork(异步作用域)取决于CoreContext(瞬态)


您的
UnitOfWork
类依赖于
CoreContext
,但您没有将
CoreContext
注册为服务,而只是作为实现。Simple Injector将只查找服务注册,但缺少
CoreContext
的注册。作为回退,Simple Injector将尝试直接解析
CoreContext
,这很有效,因为它是一种具体类型。但是,默认情况下,这些未注册的具体类型是使用瞬态生活方式解决的

但是,将DbContext实现解析为瞬态通常不是您想要的。Scoped通常更好,因此Simple Injector对此的警告是正确的

您应将注册更改为以下内容:

container.Register<CoreContext>(Lifestyle.Scoped);
container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
container.Register(lifesture.Scoped);
容器。寄存器(生活方式。范围);

为什么要注释掉webapi的依赖项解析程序?请发布完整的异常消息好吗?完整的消息更长。但是,这起作用了,我还必须更改为container.Options.DefaultScopedLifestyle=new WebRequestLifestyle();