【问题标题】:Post-initialization object creation with ninject使用 ninject 创建初始化后对象
【发布时间】:2011-11-22 12:58:31
【问题描述】:

我是 Ninject 的新手(通常是 DI)。

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

myKernel.Get<MyApp>()

它从我的模块中的绑定构造我需要的一切。如果初始化后需要新实例,这些由我为初始化绑定的工厂处理。到目前为止,工厂没有任何 ninject 依赖项,只需按需更新对象。

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

在我走得太远之前,我认为最好在这里询问其他人如何解决这个问题。

【问题讨论】:

    标签: c# architecture ninject ninject-2


    【解决方案1】:

    创建工厂接口

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

    【讨论】:

    • 谢谢雷莫。所以如果我理解正确的话,在 2.3 中你不需要担心创建工厂接口的具体实现?当使用ToFactory() 调用绑定时,ninject 会以某种方式发出实际的实现?
    • 是的,它使用动态代理自动实现
    • 不错。谢谢你的帮助。它解决了我脑海中的很多问题。
    • Remo,你能确认它实际上是Ninject.Extensions.Factory.BindToExtensions.ToFactory而不是AsFactory,还是我迷路了?
    【解决方案2】:

    看起来以下工厂模式可能满足我的要求:

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

    我有以下形式的构造函数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多