考虑以下课程
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)
{
}
}
答案 0 :(得分:2)
也许使用静态方法ala构造函数惯用法:
class Foo
{
...
public static Foo Create(Func<IBar> func)
{
return new Foo(func());
}
}
答案 1 :(得分:1)
将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;
}