使用语句没有具体实现

时间:2013-06-13 12:53:10

标签: c# design-patterns

我有一个继承自WebClient的类 - 在某些代码中我试图测试通常是这样的:

using(var client = new SomeWebClient()){...}

现在我不想在我的测试中使用那个SomeWebClient类,所以我想注入某种存根。

不使用servicelocator模式我有哪些选择?我不能使用任何真正的IoC,因为这个程序集被移动和完整.NET的多个平台使用

我确定答案是盯着我看,但我想我有“其中一天”!

2 个答案:

答案 0 :(得分:3)

1)使用界面

using(ISomeWebClientc = new SomeWebClient()){...}

2a)创建一个返回ISomeWebClient实现的工厂。

3)让它在生产代码中返回正确的类,或让它在测试中创建存根。

2b)或者,只需将ISomeWebClient传递给您的类或方法,并在测试或生产代码中以不同方式初始化它。

答案 1 :(得分:0)

您可以注入Func<TResult>。然后在Func语句中调用此using,如下所示:

using (ISomeClient client = InjectedFunc())
{
    ...
}

public delegate Func<ISomeClient> InjectedFunc();

...

然后在代码中的某处为此Func分配一个值,这是稍后要执行的代码块:

InjectedFunc = delegate(){ return new MyImplementation(); };
// or some other way of creating a new instance, as long as
// you return a fresh one

所以,这在功能上与你的使用块会说:

相同
using (ISomeClient client = new MyImplementation())
{
    ...
}