Как использовать Dependancy Injection, когда зависимый класс не известен при регистрации? - PullRequest
0 голосов
/ 19 октября 2011

У меня есть несколько вопросов о внедрении зависимостей с использованием Unity Framework 1> Всегда ли каждому классу нужен конструктор по умолчанию?2> Как зарегистрировать класс, чей зависимый класс неизвестен на момент регистрации, но на последнем этапе он станет доступным.3> Как только этот зависимый класс становится доступным на последнем этапе, как, например, назначить его обратно

, я не знаю адрес клиента во время регистрации, но адрес будет известен на последнем этапев потоке.Я регистрирую класс Customer в контейнере Unity в файле Global.ascx (запуск приложения), где я не знаю адрес.

public class Customer : IPerson<Customer>
{
    private Address _address;

    public Customer(Address address)
    {
        _address = address;
    }
}

1 Ответ

1 голос
/ 19 октября 2011

Использование внедрения зависимостей в сущности - типичная вещь, которую не нужно делать.Сущности, такие как Customer и Person, обычно являются объектами с более коротким сроком службы, которые содержат данные, а не поведение, и, следовательно, не являются хорошими кандидатами для внедрения зависимостей.

Как правило, вы должны использовать какую-то фабрику для создания тех недолговечных объектов, которыми не может управлять контейнер, или в вашем случае использовать шаблон хранилища .Добавьте ICustomerRepository в службы, которые должны иметь дело с Customers.

Чтобы ответить на другие ваши вопросы:

Всегда ли каждому классу нужен конструктор по умолчанию?

Нет, это не так.В качестве общего руководства лучше всего иметь один открытый конструктор для классов, которые используются в качестве компонентов службы (классы в вашей системе, которые содержат поведение), но это не обязательно должен быть конструктор по умолчанию.

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

В общем случае вы вводите фабрику или в некоторыхВ таких случаях вы можете добавить прокси-сервер, который знает, как создать реальный объект позже.

...