【发布时间】: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