考虑以下类
class Foo
{
public Foo(IBar bar=null)
{
}
}
我需要注入一个替代构造函数,以允许IBar实例按需提供,而不是注入。
class Foo
{
public Foo(IBar bar=null)
{
}
public Foo(Func<IBar> barFunc) : this((IBar)null)
{
}
}
然而,在几个依赖项目中有一堆代码,比如:
Foo foo = new Foo(null);
由于构造函数引用不明确,此代码将不再编译。
显然我可以把代码改成
Foo foo = new Foo((IBar)null);
但这需要对一大堆项目进行更改,而我的目标是进行透明的更改。如果不明确,有没有办法指定调用哪个构造函数?或者向编译器指示barFunc不能为空的方法
目前,我正在看这个,但感觉。。。。脏
class Foo
{
public Foo(IBar bar=null)
{
}
public Foo(Func<IBar> barFunc, bool notUsed) : this((IBar)null)
{
}
}
也许可以使用静态方法ala命名构造函数习语:
class Foo
{
...
public static Foo Create(Func<IBar> func)
{
return new Foo(func());
}
}
使Foo(Func<IBar>)
构造函数私有,并添加一个工厂方法:
public static Foo WithIBarFunc(Func<IBar> func) {
return new Foo(func);
}
如果可以的话,将Foo(Func<IBar>)
构造函数全部删除,并编写如下方法:
public static Foo WithIBarFunc(Func<IBar> func) {
var foo = new Foo(null);
// initialise foo with func...
return foo;
}