【问题标题】:Replace Ninject code with Simple Injector用 Simple Injector 替换 Ninject 代码
【发布时间】:2013-09-25 11:51:29
【问题描述】:

我找到了这个帖子Replace Ninject with Simple Injector

但尚未找到后续迁移的解决方案。 使用 Ninject:

public class ServiceClass : IServiceClass
...
IKernel kernel
...
this.kernel.Bind<IServiceClass>().ToMethod(context => this);

我尝试将这种结构与 Simple Injector 一起使用:

public class ServiceClass : IServiceClass
   ...
   Container container
   ...
   this.container = container;
   this.container.Register<IServiceClass>(() => container.GetInstance<ServiceClass >());

它是否等于Ninject one?

Ninject 的第二部分是:

public void BindSomeCallback(DelegateNumberOne delegateNumberOne)
{        
   this.kernel.Rebind<DelegateNumberOne>().ToConstant(delegateNumberOne);
}

到:

public void BindSomeCallback(DelegateNumberOne delegateNumberOne)
{ 
   this.container.Register<DelegateNumberOne, delegateNumberOne>();
}

【问题讨论】:

  • 为什么将ServiceClass 的注册放在该类本身,而不是将所有注册放在Composition Root 中?
  • @Steven 这个 ServiceClass 是一种入口点 - 并且有 2 个构造函数 - 一个用于测试套件 - 为测试准备的依赖项和另一个工作代码
  • @Steven Delphi 部分遗留代码开始我在这里展示的 .NET 部分
  • 我强烈建议您将 DI 注册分散到整个代码库中,并防止让您的应用程序依赖于您的容器。将所有注册放在一个地方(您的作曲根)。
  • @Steven The ServiceClass - 它是一个地方

标签: c# dependency-injection ninject simple-injector


【解决方案1】:

它是否等于Ninject one?

不。这是:

this.container.Register<IServiceClass>(() => this);

但既然你实际上是在注册一个单例,你最好这样写:

this.container.RegisterSingle<IServiceClass>(this);

Ninject 的第二部分是:

在这里,您想将委托注册为单例:

this.container.RegisterSingle<DelegateNumberOne>(delegateNumberOne);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多