这是将一个类注入另一个现有类的标准方法

本文关键字:另一个 注入 方法 标准 一个 | 更新日期: 2023-09-27 17:58:01

我有一个这样的类:

public class myoldClass:ImyoldClass
{
  private string _a; 
  private string _b; 
  public myoldClass (string a, string b)
  {  
      _a = a; 
      _b = b;
   }
}

现在这个类在20个不同的类中使用。我想在myoldClass的一个方法中使用类Memcache(从IMemcache继承而来),但如果我在方法中实例化了该类,那就根本不好了,因为该类取决于网络连接和缓存服务器的可用性。因此,我不能保留解决方案的标准TDD。标准的方法是,我必须实例化一个新的Memcache类,然后将其作为参数传递给构造函数。但我必须更改其他20个使用myoldClass的类别。但另一种方式可能是这样的:

public class myoldClass:ImyoldClass
{
  private string _a; 
  private string _b; 
  private IMemcache _memcache; 
public myoldClass(string a, string b, IMemcache memcache)                  
{
    _a = a; 
    _b = b; 
    _memcache = memcache; 
}
  public myoldClass (string a, string b)
  {  
      _a = a; 
      _b = b;
      _mencache = new Memcache(); 
   }
}

通过这种方式,那些使用这个类的类继续从旧的构造函数中使用它,我直接为它们实例化Memcache,在单元测试中,我使用另一个新的构造函数,并接受IMemcache作为其参数之一。

我的问题是:添加第二个构造函数是解决问题的标准方法吗?改变所有需要的地方不是比添加这个构造函数更好吗?

这是将一个类注入另一个现有类的标准方法

如果myoldClass是一个现有的类,并且您希望注入IMemcache参数,同时与非DI构造的类保持向后兼容性,则可以执行以下操作:

public myoldClass(string a, string b, IMemcache memcache = null)                  
{
    _a = a; 
    _b = b; 
    _memcache = memCache ?? new Memcache(); 
}

DI容器将提供该参数,但您现有的构造函数调用仍然可以工作。