使用Ninject内核作为工作单元对象工厂

Jas*_*yon 1 c# dependency-injection ninject

所以我开始使用Ninject进行依赖注入,我想知道人们将内核用作工作单元类型对象(如Linq2Sql Datacontexts)的对象工厂的想法.我会像普通的依赖项一样注入它们,但这会引入一些我想避免的对象生存期问题.DataContexts与一般依赖项不同,因为您应该根据需要启动新实例并在完成后处理它们.

要做这样的事情,我只需设置一个这样的提供者......

class SomeDataContextProvider : Provider<SomeDataContext>
{
    private static string _connectionString = "someConnectionString"
    protected override SomeDataContext CreateInstance(IContext context)
    {
        return new SomeDataContext(_connectionString);
    }
}
Run Code Online (Sandbox Code Playgroud)

将它们绑定在一个模块中......

class MyModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        Bind<SomeDataContext>().ToProvider(SomeDataContextProvider);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在需要时使用标准内核......

class MyClassThatNeedsADataContext
{
    private StandardKernel _kernel = new StandardKernel(new MyModule());

    public void SomeMethod()
    {
        using (var db = _kernel.Get<SomeDataContext>())
        {
            //Use the context
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于什么本质上是一个静态工厂来说似乎有点沉重,但无论如何我正在使用Ninject进行其他工作.我喜欢它为团队中的成员提供了一个工厂惯例,而不是让他们躲避它(在奇怪的地方创建一堆不同的工厂类,或者只是在对象上放置静态方法等).

思考?有没有更好的方法来处理使用依赖注入的DataContexts或WCF服务客户端等工作单元依赖项?

Lee*_*Lee 5

我不喜欢将容器注入到类中,因为它在应用程序和容器之间创建了依赖关系,并且不太清楚类具有什么依赖关系.我真的没有看到这种方法如何在工厂中获得任何收益,所以我个人创建了一个'DataContextFactory'并将其注入任何需要访问数据库的类中.