概要
使用依赖注入与我的Winfor应用程序正在创建大量的Repository上下文.我不知道我使用的方式是对还是错,或常见的做法是什么.
细节
在过去的6个月中,我一直在使用存储库模式来构建单元O工作模式的ASP.NET MVC应用程序.除此之外,我一直在使用依赖注入对所有这些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方案中正确的.
>上下文只会存在一次,每个REQUEST命中
网络服务器.
KEWL.
现在,对于我的WinForm应用程序,我最初创建了一个单一的
单位工作对象(没有依赖注入,只是),并不断传递那个宝宝
所有的服务(然后到仓库).
对于这个win应用程序,它会点击DB查找所有的文本
需要解析的文件(例如25个文件).然后,对于每个文件,它
创建一个新的解析器,读取每一行并将解析的数据插入
一个db表.精细.
问题是,这个构想在所有的分析者中都是分享的
正在严重地扔掉了整个商店的错误.
所以我添加了一些依赖注入,并使用上面的注册表代码.排序相同的事情 – 很多严重的错误.这是因为单个线程再次创建了一个上下文 – > 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秒钟内回来.
这些文件中的每一个都被解析,是否是自己的线程?
然后为每个线程创建一个上下文? (我觉得是类似的
Web场景).还是这样吗?我知道这是很多的上下文,但是
每个上下文并不意味着与数据库的直接连接
连接池,这不应该真的是一个问题.
它有这么多背景的原因是因为如下
代码…(和这些是一些单独的构造函数
存储库类…)
public sqlServerContext(string,string); public GameFileRepository (IUnitOfWork); public LogEntryRepository(IUnitOfWork); public AlertRepository(IUnitOfWork); ... etc..
并为主要服务…
public PunkBusterParser(IUnitOfWork,IGameFileRepositry,ILogEntryRepository,ILoggingService);
所以服务需要一个UoW,每个存储库也都需要
一个..这意味着每个都创建一个新的.
我确定我没有正确地结构化…
任何建议都会真诚感谢!