2013-06-13 3 views
0

У меня есть класс, который наследуется от WebClient - в какой-то код, который я пытаюсь проверить есть обычный:Используя заявление без конкретной реализации

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

Теперь я не хочу использовать этот класс SomeWebClient в моем поэтому я хотел бы ввести какой-то заглушку.

Без использования шаблона servicelocator какие у меня варианты? Я не могу использовать настоящий IoC, поскольку эта сборка используется несколькими платформами как мобильными, так и полными. NET

Я уверен, что ответ смотрит мне в лицо, но я думаю, что у меня есть «один из тех дней» «!

+0

Можете изменить код, который хотите проверить? –

+0

Я могу, но ничего огромного – iwayneo

+0

Прошу прощения, я не совсем понимаю, что мешает вам использовать рамки DI. Не могли бы вы немного разобраться? –

ответ

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()) 
{ 
    ... 
} 
+0

Зачем вам использовать делегат вместо более сжатого синтаксиса лямбда? '() => новый MyImplementation()' – svick

3

1) Используйте интерфейс

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

2a) Создайте фабрику, которая возвращает реализацию ISomeWebClient.

3) Позвольте ему вернуть ваш правильный класс в производственный код или позволить ему создать заглушку в ваших тестах.

2b) Кроме того, просто передайте ISomeWebClient вашему классу или методу и инициализируйте его по-разному в тестовом или производственном коде.

Смежные вопросы