Ninject缓存一个注入的DataContext?生命周期管理?

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)请求的基础上注册它.然而; 可能需要改变您需要设计应用程序的方式,所以一如既往:它取决于您.请看一下这个答案.

  • 做了一个梦.整齐地分开了担忧.我控制下的参数.需要最小的依赖注入.我的知识逐渐扩大而不是显着扩展.惊喜被最小化.我继续前进.圣诞节快乐. (2认同)