【问题标题】:Configure Ninject Factory to return the same instance every time将 Ninject Factory 配置为每次返回相同的实例
【发布时间】:2015-06-03 08:45:14
【问题描述】:

我有一个正在重用的服务层(AKA 业务层)。

这是我的一个具有IMyContextFactory 依赖项的服务示例,它返回IMyContext 的实例。

public class MyService : IMyService 
{
    private IMyContextFactory DbContextFactory;

    public MyService(IMyContextFactory dbContextFactory)
    {
        this.DbContextFactory = dbContextFactory;
    }

    public DoSomething(int id)
    {
        // Get instance of the db for use
        IMyContext dbContext = this.DbContextFactory.CreateMyDbContext();

        // Use the business layer for something
        var user = dbContext.Set<User>().Find(id);
    }
}

我正在使用Ninject Factory extension

是否可以让IMyContextFactory 每次都返回相同的IMyContext 实例?

背景

最初我在没有工厂的情况下直接将 IMyDbContext 注入到服务中,当我的 ASP.NET MVC 网站初始化时,我得到了这个 InRequestScope()

但现在我也在 Windows 服务中使用该服务,我不希望我的 DbContext 因为频繁循环而变得臃肿。我也不希望我的服务在每次请求时都被newed,所以这就是为什么我认为服务中的工厂可以解决问题。

我需要最好的InRequestScope() 和一个新实例,每次取决于配置。我已经为 ASP.NET 和 Windows 服务提供了单独的配置 - 这就是我每次从工厂获得单例的方式。

【问题讨论】:

  • 必须始终在每次使用后销毁您的 DbContext。除了摧毁它们之外,它们没有任何清理自己的机制。因此,如果您不定期丢弃它们,它们将增长并消耗越来越多的资源。 DbContexts 也不是线程或多用户安全的,因为它们具有固有状态。帮自己一个忙,每次使用后都要销毁上下文。
  • 这确实是我的想法,这就是为什么我将我的 DbContext 放在请求范围内(根据请求创建和销毁),我希望它是每次调用我的方法时的新的服务层,当我从我的 Windows 服务循环调用它时。感谢您的帮助
  • 我很困惑。您的标题表明您想在任何地方使用相同的实例。但是您的评论表明您没有..是哪一个?我真的不明白你的问题,因为你一直在单例(应用程序生命周期的一个实例)和请求生命周期之间切换..
  • @ErikFunkenbusch 没问题。很抱歉让您感到困惑。我正在调用我的服务层并从两个单独的项目中对其进行配置,这就是为什么对于一个我每次都需要相同的实例而对于另一个我每次都需要一个新实例,具体取决于 Ninject 配置。问题是他们使用相同的代码,但它必须能够做到其中之一。我开始使用工厂,但我希望它每次都返回相同的实例 - 本质上是配置工厂以不同的行为。

标签: c# entity-framework ninject ninject-extensions


【解决方案1】:

我对Ninject并不完全精通,但是根据这个页面https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface看来,工厂返回的实例是从IResolutionRoot中检索的。

我的看法是,您必须使用单例生命周期类型注册您的 IMyContext 具体类型。

(但根据 Erik Fukenbusch 的评论,不破坏您的上下文似乎不是一个好主意)

【讨论】:

  • 对了。所以我可以继续设置范围,我的工厂会遵守这个范围吗?
  • 太棒了,你是对的!如果我为InRequestScope()InTransientScope() 配置IMyContext,则工厂在创建新实例时会使用此信息!像魅力一样工作
猜你喜欢
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多