【问题标题】:Ninject - InCallScope returning different instances for injected objectsNinject - InCallScope 返回注入对象的不同实例
【发布时间】:2014-02-06 19:20:36
【问题描述】:

我有一个存储库层,其中将 DbContext 带入构造函数。我正在使用 InCallScope 但存储库中的 dbcontext 实例似乎不同。代码如下:

Bind<DbContext>().ToMethod(ctx =>new TaCertoEntities()).InCallScope();
Bind<IContratacaoRepository>().To<ContratacaoRepository>();

 using (var context = Ioc.Container.Get<DbContext>())
        {
            Ioc.Container.Get<IContratacaoRepository>().Insert(xxx);

            context.Save();
        }

我做错了什么?

谢谢!

【问题讨论】:

    标签: ninject repository-pattern unit-of-work


    【解决方案1】:

    每次您使用IoC.Container.Get&lt;T&gt; 向内核请求服务时,如果您使用InCallScope(),您将获得不同的实例。这就是你做错了。

    你应该避免使用这个Service Locator anti-pattern。您面临的这种症状显然是这种反模式的一个副作用:您不知道您的 Composition Root 在哪里。

    如果不确定您的合成根,则使用范围实际上是无用的。当你每次需要依赖时通过Service Locator请求新实例时,内核无法猜测如何解析范围,你必然会遇到这种问题。

    如果您使用的是 MVC / WebAPI 应用程序,您的控制器肯定会成为您的对象图的激活点,因为它的依赖项将被注入。但是您必须将其留给 Ninject 为您完成这项工作。

    Nuget 包 Ninject.MVC3 自动配置您的 Web 应用程序以进行注入。或者,如果您不使用 Web 应用程序,请提供更多示例代码,以便我可以帮助您确定您的组合根是什么以及范围如何帮助您解决您面临的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多