Структурирование внедрения зависимостей для класса с внедренными службами и данными - PullRequest
0 голосов
/ 29 ноября 2010

Я использую контейнер IoC, который использует инжекцию конструктора (например, Castle Windsor). У меня есть следующий (пример) класс, который управляет продуктом ...

public class ProductDataManager
{
    public ProductDataManager(Product product, IProductDataLoader productDataLoader)
    {
    }

    // a number of methods here that manage the products data in different ways...
}

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

Как определить этот класс (ProductDataManager) в контейнере IoC (и / или классе потребления), чтобы зависимость службы (IProductDataLoader) могла быть внедрена контейнером IoC, а зависимость данных (Product) быть переданным классом потребления?

Или это запах кода? Если да, то как это можно изменить?

1 Ответ

4 голосов
/ 29 ноября 2010

Вы можете использовать TypedFactoryFacility и сделать что-то вроде этого (от головы до головы) ... сначала определите интерфейс для вашей абстрактной фабрики:

public interface IProductDataManagerFactory
{
    ProductDataManager Create(Product product);
}

Зарегистрируйте фабрику следующим образом:

container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IProductDataManagerFactory>().AsFactory());

Теперь службы могут зависеть от IProductDataManagerFactory и могут вызывать Windsor container.Resolve через автоматически реализованную фабрику.

Обратите внимание, что имя параметра product в сигнатуре метода должносоответствуют имени параметра в ctor ProductDataManager.

...