2011-11-22 52 views
5

我是Ninject(以及一般DI)的新手。使用ninject创建后初始化对象

我了解内核加载模块,而且我至今写的代码往往有一行:

myKernel.Get<MyApp>() 

它构建的一切,我从绑定需要我的模块中。如果在初始化后需要新实例,这些都由我为初始化绑定的工厂负责。到目前为止,工厂已经没有任何ninject依赖关系,只需要按需新建对象。

现在我已经达到了一点,我需要在初始化后考虑创建对象,而我自己的工厂模式不再削减它。这将用于支持(远程)客户端的pub/sub界面。通过与我的服务器的每个新连接,我想根据ninject模块中定义的一组绑定来创建新的实例IClient。这是否意味着我在初始化时传入的工厂必须拥有自己的内核(或者指向主内核)? CommonServiceLocator的功能在哪里。 CSL是必要的吗?

在我走得太远以至于死路一条之前,我认为最好在这里问一下其他人如何解决这个问题。

回答

5

创建一个工厂接口

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

对于Ninject 2.3,请参阅https://github.com/ninject/ninject.extensions.factory,并由Ninject通过添加以下配置。

Bind<IClientFactory>().ToFactory(); 

对于2.2自己来执行。这个实现是容器配置的一部分,不属于你的实现。

public class ClientFactory: IClientFactory 
{ 
    private IKernel kernel; 
    public ClientFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IClient CreateClient() 
    { 
     return this.kernel.Get<IClient>(); 
    } 
} 
+0

谢谢雷莫。所以如果我理解正确,在2.3中你不需要担心创建工厂接口的具体实现?当使用'ToFactory()'调用绑定时,ninject以某种方式发出实际的实现? – spender

+0

是的,它使用动态代理自动实现 –

+0

不错。谢谢你的帮助。它清除了我脑海中的很多问题。 – spender

1

它看起来像工厂下面的模式可能会满足我的要求:

Bind<Func<IClient>>().ToMethod(ctx =>() => ctx.Kernel.Get<ClientImpl>()); 

在那里我有以下形式的构造:

SomeCtor(Func<IClient> clientFactory, blah...)