2012-03-15 2 views
6

Каков правильный способ сделать ниже, так что ParentClass не зависит от MyClass?Зависимость впрыска в петле

public class ParentClass 
{ 
    public void MyFunction(IList<Foo> foos) 
    { 
     foreach (var bar in foos) 
     { 
      var myClass = new MyClass(); 
      myClass.DoStuff(); 
     } 
    } 
} 

Обычно без цикла я просто впрыснуть его с конструктором ParentClass, но здесь мне нужен новый экземпляр, для каждой итерации цикла.

Или, может быть, есть лучший способ сделать то, что я пытаюсь достичь? Возможно, myClass может перезагрузиться в конце каждой итерации, чтобы я мог повторно использовать его?

+0

Тогда почему бы не определить коллекцию объектов или просто определить DoStuff как статичный, как вы создаете новый экземпляр, и немедленно выбросить их. –

ответ

7

Вы можете ввести фабричный объект, который создает экземпляры MyClass в ParentClass.

Для каждой итерации цикла вы вызываете фабричный объект, чтобы он дал вам новый экземпляр MyClass.

+1

Как вы создаете объект внутри фабрики, когда объект имеет дополнительную зависимость? В этом случае мы должны ввести контейнер непосредственно на завод. Здесь я вижу два оговорки - контейнер для инъекций и использование контейнера. Революция (локатор обслуживания). Это рекомендуется? Любой другой подход? – hungryMind

+0

Это хороший вопрос, @hungryMind, я думаю, вы должны продвигать его как реальный вопрос в SO и связывать его с этим. Во всяком случае, я нашел эту статью, которая предоставляет некоторые варианты: http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/ – Fabio

1

Вы можете ввести Func<IMyClass> в конструктор, а затем вызвать его столько раз, сколько хотите получить разные экземпляры.

Основы IoC, такие как Autofac, поддерживают это изначально.

+0

Я с вами. Однако я бы посоветовал не использовать контейнер IoC до тех пор, пока он не понадобится: DTSTTCPW («Упростите, думайте, что может работать») – Skyp

+0

@Skyp «Простейший» - это неопределенная концепция без целей или целей. Если модульное тестирование является целью, то использование IoC является одной из самых простых вещей, которые могли бы работать. –

0

Это действительно зависит от того, что вы хотите делать с MyClass. Как бы там ни было, нет никакой корреляции между foo, bar и MyClass. Предполагая, что вы должны либо ввести планку в Ctor MyClass, либо передать ее как параметр для DoStuff, тогда я бы просто ввел заводский класс или метод в ParentClass Ctor и использовал это вместо нового MyClass.

0

Предлагаемая инъекция читаема, понятна и проста для проверки правильности.

Сброс объекта является опцией, если цикл большой или если MyClass дорог для создания (например, он открывает соединение, дескриптор файла, подпроцесс или запускает поток).

Поскольку решение reset() требует больше времени и концентрации для проверки при каждом изменении кода, я рекомендую фактически измерить, что это узкое место, прежде чем беспокоиться.

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