初始化后用ninject创建对象

本文关键字:创建对象 ninject 初始化 | 更新日期: 2023-09-27 18:15:35

我是Ninject(和一般的DI)的新手。

我理解内核是如何加载模块的,到目前为止我写的代码往往只有一行:

myKernel.Get<MyApp>()

从我的模块中的绑定中构造我需要的一切。如果需要在初始化后创建新实例,则由我为初始化绑定的工厂来处理。到目前为止,工厂没有任何对象依赖,只是根据需要更新对象。

现在我已经达到了一个点,我需要考虑初始化后的对象创建,我自己的工厂模式不再切割它了。这将支持(远程)客户端的发布/订阅接口。对于到服务器的每个新连接,我都希望根据在一个ject模块中定义的一组绑定创建新的IClient实例。这是否意味着我在初始化时传入的工厂必须有自己的内核(或对主内核的引用)?CommonServiceLocator的功能在哪里?CSL是必需的吗?

在我深入探讨这个问题之前,我想最好先问问别人是如何处理这个问题的。

初始化后用ninject创建对象

创建工厂接口

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>();
    }
}

看起来下面的factory模式可能满足我的要求:

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

我有一个构造函数的形式:

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