声明对不明确的构造函数引用的解析



考虑以下类

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;
}

最新更新