【问题标题】:Simple Injector scope with DbContext带有 DbContext 的简单注入器作用域
【发布时间】:2019-07-26 16:19:27
【问题描述】:

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

我有一个也有 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 (Async Scoped) 依赖于 CoreContext (Transient)。

【问题讨论】:

  • 为什么注释掉webapi的依赖解析器?
  • 您能否发布完整的异常消息?完整的消息更长。

标签: dependency-injection simple-injector


【解决方案1】:

您的UnitOfWork 类依赖于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);

【讨论】:

  • 这行得通,但是,我还必须更改为 container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多