Как избежать обхода контейнера МОК - PullRequest
1 голос
/ 06 февраля 2012

У меня есть какой-то устаревший код, который создает экземпляры классов.

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

Логика в основном зацикливается на массиве типов классов, и, если он совпадает с тем, который выбрал пользователь, он вызывает CreateInstance.

Это хорошо, но я могу думать только об этом.функциональность состоит в том, чтобы передать контейнер IOC и вызвать Resolve, который предоставит новый экземпляр класса.

Я знаю, что это серьезно осуждается, но я не могу думать, как заставить его работать.

1 Ответ

1 голос
/ 06 февраля 2012

Создайте абстрактную фабрику, которая обеспечивает уровень абстракции между контейнером IOC и кодом, требующим новых экземпляров, это позволит избежать засорения кода зависимыми от контейнера вызовами.

Например, при использовании «Unity Application Block», Func<T> может использоваться как фабрика.Это Func<T> затем скрывает реализацию контейнера, которая на самом деле container.Resolve<T>().

Обновление

Вот пример:

public class TestClass
{
    readonly Func<Foo> _fooFactory;

    public TestClass(Func<Foo> fooFactory)
    {
        _fooFactory = fooFactory;
    }

    public void LoadFoo()
    {
        var foo = _fooFactory(); // This hides the call container.Resolve<Foo>()
        // Do something with foo
    }
}
...