使用DbContext的简单注入器作用域

时间:2019-03-05 08:49:16

标签: dependency-injection simple-injector

我正在使用简单的注射器。

我有一个也有ApiControllers的mvc项目。

这是我的设置:

 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);
    }
}

但是这给了我错误:

  

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

1 个答案:

答案 0 :(得分:1)

您的UnitOfWork类依赖于CoreContext,但是您没有将CoreContext注册为服务,而只是注册为实现。 Simple Injector将仅查找服务注册,但缺少CoreContext的注册。作为后备,Simple Injector将尝试直接解析CoreContext,这是可行的,因为它是具体类型。但是,这些未注册的具体类型默认情况下会使用Transient生活方式解决。

但是,通常不需要将DbContext实现解析为Transient。范围通常更好,因此简单注入器在警告此方面是正确的。

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

container.Register<CoreContext>(Lifestyle.Scoped);
container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);