这是将一个类注入另一个现有类的标准方法
本文关键字:另一个 注入 方法 标准 一个 | 更新日期: 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容器将提供该参数,但您现有的构造函数调用仍然可以工作。