2009-11-17 74 views
1

因此,我开始使用Ninject进行依赖注入,并且我想知道人们如何使用内核作为工作单元类型对象(如Linq2Sql Datacontexts)的对象工厂。我只是像正常的依赖注入它们,但是这引入了一些我想避免的对象生存期问题。 DataContexts不同于一般的依赖关系,因为你应该根据需要启动新的实例,并在完成时处理它们。使用Ninject内核作为工作单元对象工厂

要做到这样的事情需要我简单地设置像这样的提供者...

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

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

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

,并使用标准的内核时...

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

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

它似乎有点沉重,基本上是一个静态工厂,但我使用Ninject的其他东西nyway。我喜欢它为团队中的成员提供了一个工厂的约定,而不是让他们接受它(在奇怪的地方创建一堆不同的工厂类,或者只是在对象上添加静态方法等)。

想法?有没有更好的方法来处理使用依赖注入的DataContexts或WCF Service Clients等工作单元依赖关系?

回答

5

我不喜欢将容器注入到类中,因为它会在应用程序和容器之间创建依赖关系,并且不太清楚类所依赖的依赖关系。我真的不知道这种方法如何让工厂获得任何东西,所以我个人会创建一个'DataContextFactory'并将其注入到需要访问数据库的任何类中。

+0

好得多。在注入依赖和注入工厂之间我的大脑陷入了某处。谢谢。 – 2009-11-17 22:03:18