带 DbContext 的简单注入器范围

Simple Injector scope with DbContext

我使用的是简单的注射器。

我有一个 mvc 项目也有 ApiControllers。

这是我的设置:

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

但是这给了我错误:

The configuration is invalid. The following diagnostic warnings were reported: -[Lifestyle Mismatch] UnitOfWork (Async Scoped) depends on CoreContext (Transient).

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

然而,将 DbContext 实现解析为 Transient 通常不是您想要的。 Scoped 通常更好,因此 Simple Injector 在警告中是正确的。

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

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