(为文字墙道歉...... :))
概括
在我的 Winfor 应用程序中使用依赖注入会创建大量的存储库上下文。我不确定我使用它的方式是对还是错,或者常见的做法是什么。
细节
在过去的 6 个多月里,我一直在制作 ASP.NET MVC 应用程序,这些应用程序使用存储库模式实现了 Unit Of Work 模式。最重要的是,我一直在对所有这些 Web 应用程序使用依赖注入并取得了一些成功。
所以这是我连接我的存储库的一个例子。
public EntityFrameworkRepositoryRegistry()
{
For<IUnitOfWork>()
.HybridHttpOrThreadLocalScoped() // Lifecycle of the object.
.Use<SqlServerContext>() // My EF Context.
.Ctor<string>("connectionString").Is("name=SqlServer_EF")
.Ctor<string>("defaultContainerName").Is("Entities");
// Ayende's EFProf application :)
EntityFrameworkProfiler.Initialize();
Scan(x =>
{
x.TheCallingAssembly();
x.ExcludeNamespaceContainingType<Fake.FakeContext>();
x.WithDefaultConventions();
}
);
}
好的 - 效果很好。这里要注意的主要是
- 我假设生命周期是 Web 场景的正确生命周期。
- 上下文将只存在一次,每个请求命中网络服务器。
科尔。
现在,对于我的 WinForm 应用程序,我最初创建了一个单一的工作单元对象(还没有依赖注入),并不断地将这个婴儿传递给所有服务(然后传递给存储库)。
对于这个 win 应用程序,它会访问数据库以找出它需要解析的所有文本文件。(例如 25 个文件)。然后,对于每个文件,它创建一个新的解析器,读取每一行并将解析的数据放入数据库表中。美好的。
问题是,所有解析器都共享此上下文,这在整个商店中都严重引发了错误。
然后我添加了一些依赖注入并使用上面的注册表代码。Sorta 同样的事情 - 很多严重的错误。这是因为再次为单线程-> winform 创建了一个上下文。
因此,我现在将上下文注册表调整为以下内容:-
public EntityFrameworkRepositoryRegistry(bool isForTheWeb)
{
if (isForTheWeb)
{
For<IUnitOfWork>()
.HybridHttpOrThreadLocalScoped()
.Use<SqlServerContext>()
.Ctor<string>("connectionString").Is("name=SqlServer_EF")
.Ctor<string>("defaultContainerName").Is("Entities");
}
else
{
For<IUnitOfWork>()
.Use<SqlServerContext>()
.Ctor<string>("connectionString").Is("name=SqlServer_EF")
.Ctor<string>("defaultContainerName").Is("Entities");
}
EntityFrameworkProfiler.Initialize();
Scan(x =>
{
x.TheCallingAssembly();
x.ExcludeNamespaceContainingType<Fake.FakeContext>();
x.WithDefaultConventions();
});
}
因此,对于 WinForm 应用程序,它现在不设置生命周期。我认为这创造了大约 160 个左右的上下文!(但它也没有真正出错)。
所以,我不确定这是否是正确的做事方式。
所以我的应用程序实际上有 25 个不同的计时器,每 .. 说 .. 10 秒检查一个文件。如果有新数据,它会解析它。否则,请在 10 秒后返回。
每一个被解析的文件都应该是它自己的线程吗?然后为每个线程创建一个上下文?(我觉得类似于网络场景)。或者这样好吗?我知道它有很多上下文,但是每个上下文并不意味着与数据库的实时连接..并且使用连接池,这应该不是问题。
它有这么多上下文的原因是因为下面的代码......(这些是一些存储库类的单独构造函数......)
public SqlServerContext(string, string);
public GameFileRepository (IUnitOfWork);
public LogEntryRepository(IUnitOfWork);
public AlertRepository(IUnitOfWork);
... etc..
对于主要服务...
public PunkBusterParser(IUnitOfWork, IGameFileRepositry,
ILogEntryRepository, ILoggingService);
因此该服务需要一个 UoW 并且每个存储库也需要一个 ..这意味着正在为每个存储库创建一个新的。
我确定我的结构不正确...
任何建议将不胜感激!