При использовании контейнера IoC, как передать динамические данные / объекты в класс? - PullRequest
3 голосов
/ 30 сентября 2011

У меня есть класс Order с указанным ниже конструктором

public Order(IProduct product, short count)
{
this._product = product;
this._count = count;
}

Я пытаюсь настроить контейнер Unity IoC и, очевидно, для создания объекта заказа мне нужно знать количество и продукт, но этоопределяется во время выполнения;счет может быть любым значением, а продукт может быть любым продуктом, например, морковь, дыня и т. д.

Итак, как применить IoC для этого?

Один из подходов, который я думал, заключался в том, что мой конструктор принимает только объектзависимости, затем любое другое обязательное свойство, добавляемое с использованием нового метода Initialize ():

public Order (IProduct product)
{
this._product = product;
}

public Initialize(short count)
{
this._count = count;
}

, таким образом, кто бы ни создавал объект Order, он должен впоследствии вызывать метод Initialize (), чтобы другие свойства, которые могутне будет обработан контейнером IoC и будет добавлен к нему.

Это подход, который вы рекомендуете / используете?

Ответы [ 4 ]

6 голосов
/ 30 сентября 2011

Это не похоже на подходящую ситуацию для контейнера IoC для меня. Предположительно, заказы могут регулярно создаваться для разных Продуктов (и считаться) на протяжении всего жизненного цикла приложения, основываясь на поведении пользователя, которое предполагает, что контейнер должен быть настроен для каждого контекста, в котором могут быть созданы Заказы, то есть каждая страница продукта.

Контейнеры IoC работают лучше всего, когда вы можете принимать решения о зависимостях редко и на раннем этапе, например, при запуске приложения. Если решение о том, какую зависимость внедрять, всегда имеет место примерно в то же время, что и создание зависимого объекта, тогда контейнер IoC просто добавляет ненужную сложность.

1 голос
/ 30 сентября 2011

С Unity вы сможете настроить ParameterOverride для передачи ваших дополнительных параметров:

container.Resolve<IOrder>(new ParameterOverrides { { "Count", 1 } });

Хорошо, альтернативно создайте фабричный класс:

class OrderFactory : IOrderFactory
{
    public OrderFactory ( IProduct product );
    public Order GetOrder (count)
    {
        return new Order ( product, count );
    }
}

Используйте контейнер для разрешения фабрики. Тогда используйте фабрику, чтобы решить ваши заказы.

0 голосов
/ 30 сентября 2011

@ scottm Это фактический код, который у меня есть на моей странице aspx:

private IStoresRankingReportPresenter _presenter;

     protected void Page_Init(object sender, EventArgs e)
            {
                this._presenter = ServiceLocator.Current.GetInstance<IStoresRankingReportPresenter>();

                this._presenter.Initialize(this, this.Count);

                this._presenter.OnPageInit();
            }
0 голосов
/ 30 сентября 2011

Счет, вероятно, должен быть просто свойством Порядка. Что представляет собой счет? Количество строк заказа или количество продукта? Я не совсем уверен, как вы планируете внедрение и контейнер IoC здесь.

Примерно так:

public class Order
{
  private IProduct _product;
  public Order(IProduct product)
  {
    _product = product;
  }

  public int Count {get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...