当前位置:  开发笔记 > 编程语言 > 正文

依赖注入选择

如何解决《依赖注入选择》经验,为你挑选了3个好方法。

我正在寻找依赖注入,我可以看到它的好处,但我遇到了它创建的语法问题.我有这个例子

public class BusinessProducts
{
   IDataContext _dx;

   BusinessProducts(IDataContext dx)
   {
      _dx = dx;
   }

   public List GetProducts()
   {
    return dx.GetProducts();
   }
}

问题是我不想写

BusinessProducts bp = new BusinessProducts(dataContextImplementation);

我会继续写

BusinessProducts bp = new BusinessProducts();

因为我觉得第一种选择只是感觉不自然.我不想知道BusinessProduct"依赖"什么来获取产品,我也觉得它使我的代码更难以理解.

这种方法有什么替代方法,因为我想保留我创建对象的原始语法,但我仍然希望能够在单元测试时伪造依赖关系,还是这个依赖注入框架可以为我做什么?

我在c#编码,但欢迎其他语言的替代品



1> tvanfosson..:

我使用工厂作为我的上下文并注入它,如果提供的工厂为null,则提供合适的默认值.我这样做有两个原因.首先,我使用数据上下文作为工作范围对象的单元,因此我需要能够在需要时创建它们,而不是保持一个.其次,我主要使用DI来提高可测试性,而仅仅考虑次要因素.

所以我的商业产品类看起来像:

public class BusinessProducts
{
     private IDataContextFactory DataContextFactory { get; set; }  // my interface

     public BusinessProducts() : this(null) {}

     public BusinessProducts( IDataContextFactory factory )
     {
          this.DataContext = factory ?? new BusinessProductsDataContextFactory();
     }

     public void DoSomething()
     {
          using (DataContext dc = this.DataContextFactory().CreateDataContext())
          {
             ...
          }
     }

另一种方法是使工厂属性可公开设置,并通过设置属性注入备用工厂.无论哪种方式,如果你想保留null构造函数,你需要提供一个默认值.



2> troelskn..:

你可以创建一个工厂.DI容器最适合在设置时发生的布线 - 而不是在运行时(因为这看起来是这样).工厂可以以不同的方式实施,具体取决于它需要的可插拔性,以及需要使用它的地方数量.



3> Owen..:

我通常会有一个空的构造函数,它使用一个实体实例(或由IoC创建的实例),并使用DI.即

public class BusinessProducts
{
   IDataContext _dx;

   BusinessProducts()
   {
      _dx = new SolidDataContext();
   }

   BusinessProducts(IDataContext dx)
   {
      _dx = dx;
   }
}

这样,您可以使用DI来覆盖单元测试测试中的默认实例.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有