DI

时间:2017-11-02 14:32:56

标签: c# dependency-injection refactoring resharper ninject

如果之前有人问过/回答道歉,我对这个主题的搜索引出了一系列与我的任务没有直接关系的话题。

我目前需要完成在内部代码库中重构大量构造函数的目标,以支持使用Ninject进行构造函数注入。目前,我们有大量KernelInstance.Get<T>实例作为getter属性,例如:

IRequiredService => StaticKernelReference.Get<IRequiredService>();

其中StaticKernelReference是对Ninject StandardKernel的静态实例的引用(我知道这也被认为是反模式,并且这个重构是杀死对Ninject实例的所有静态引用的目标的一部分)< / p>

在放弃这种显然被认为是反模式的方法时,我想重构这些方法:

public class ClassWithDependencies {
  readonly IRequiredSevice _requiredService;
  public ClassWithDependencies(IRequiredService requiredService){
    _requiredService = requiredService;
  }
}

我的问题实际上是双重的,但对这两个问题的帮助将不胜感激。

  1. 上面的例子提供了做构造函数注入这些依赖关系的理想方法(我对SO和其他地方的研究表明是,但如果我做出了错误的结论,我会很感激输入)。我非常有信心这种方法是我们现有方法的改进,但如果不理想,我宁愿不必对这个特定的部分进行第二次重构。在大多数情况下,这些不是可选的依赖项(以及我使用构造函数注入模式的原因),并且我知道属性注入的[Inject]装饰器。

  2. 我用resharper标记了这个问题,因为对于像这样的大规模重构,这是唯一想到的。是否有任何好的方法来添加构造函数参数,然后代码片段/模板自动生成对构造函数中的只读私有变量的赋值并向该类添加字段?虽然我可以手动执行此操作,但我预计这会非常繁琐且耗时,因为此模式至少有几百个实例正在使用。

1 个答案:

答案 0 :(得分:3)

  1. 是的,这种方法很好。向构造函数注入所需的依赖项使它们显式且可见。现在要弄清楚你的类的依赖关系,除了检查它的源代码之外别无选择。当它们被注入构造函数时不再是这种情况。

  2. 要快速修复当前代码,您可以执行以下操作。你有这个代码行:

    IRequiredService SomeService => StaticKernelReference.Get<IRequiredService>();
    

    首先删除姓名后的所有内容:

    IRequiredService SomeService;
    

    这将使您的财产成为私人领域。然后alt-enter并使用构造函数&#34;初始化字段#34;重构。然后你有这个:

    IRequiredService Service;
    public A(IRequiredService service) {
        Service = service;
    }
    

    然后继续使用alt-enter&#34;重命名为_service&#34; (取决于你如何命名你的私人字段),然后再次alt-enter和&#34; make field readonly&#34;。

    readonly IRequiredService _service;
    public A(IRequiredService service) {
        _service = service;
    }