Внедрение зависимостей в цикле - PullRequest
6 голосов
/ 15 марта 2012

Как правильно сделать следующее, чтобы ParentClass не зависело от MyClass?

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

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

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

Ответы [ 4 ]

7 голосов
/ 15 марта 2012

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

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

1 голос
/ 15 марта 2012

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

Фреймворки IoC, такие как Autofac, поддерживают это изначально.

0 голосов
/ 15 марта 2012

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

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

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

0 голосов
/ 15 марта 2012

Это действительно зависит от того, что вы хотите сделать с MyClass. В настоящее время нет никакой корреляции между foo's, bar и MyClass. Предполагая, что вы либо вставите bar в Ctor of MyClass, либо передадите его в качестве параметра DoStuff, тогда я просто добавлю фабричный класс или метод в ParentClass Ctor и использую его вместо нового MyClass. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...