awr*_*ley 5 datacontext lifecycle dependency-injection ninject
我的存储库中抛出了一系列非常奇怪的错误.未找到或更改行,2个更新中的1个失败...没有任何意义.
好像我的DataContext实例正在被缓存......没有任何意义,我正在考虑职业生涯.
然后我注意到使用Ninject使用依赖注入传递了DataContext实例(这是我第一次使用DI ...).我撕掉了依赖注入,一切都恢复了正常.即刻.
所以依赖注入是个问题,但我仍然不知道为什么.我猜测Ninject正在缓存注入的DataContext.
它是否正确?
Ninject绑定如下:
Bind<IPupilBlockService>().To<SqlPupilBlockService>()
.WithConstructorArgument("db", new dbDataContext());
Run Code Online (Sandbox Code Playgroud)
Ste*_*ven 14
对于生命周期必须明确管理的任何对象(例如实现的对象IDisposable)或对用户有用的任何对象,尽量不要注入它们,而是注入允许创建此类对象的工厂.例如,定义此接口:
public interface IDbDataContextFactory
{
dbDataContext CreateNew();
}
Run Code Online (Sandbox Code Playgroud)
并使用如下:
public class SqlPupilBlockService
{
private IDbDataContextFactory contextFactory;
public SqlPupilBlockService(
IDbDataContextFactory contextFactory)
{
this.contextFactory = contextFactory;
}
public void DoSomeOperation()
{
using (var db = this.contextFactory.CreateNew())
{
// use the dbDataContext here.
}
}
}
Run Code Online (Sandbox Code Playgroud)
实现非常简单,如下所示:
public class DbDataContextFactory : IDbDataContextFactory
{
public dbDataContext CreateNew()
{
return new dbDataContext();
}
}
Run Code Online (Sandbox Code Playgroud)
注册如下:
Bind<IDbDataContextFactory>().To<DbDataContextFactory>();
Run Code Online (Sandbox Code Playgroud)
工厂的使用使得它非常明确谁是所创建对象的所有者以及谁应该控制其生命周期.这使您的代码更具可读性,并遵循最少惊喜的原则.
UPDATE
自从我提交这个答案以来已有一年多了.我现在经常注入数据上下文而不是使用工厂,并在每个(web)请求的基础上注册它.然而; 可能需要改变您需要设计应用程序的方式,所以一如既往:它取决于您.请看一下这个答案.
| 归档时间: |
|
| 查看次数: |
4220 次 |
| 最近记录: |