2008-10-01 5 views
5

Я немного новичок из DI, так что простите меня, если это неправильный подход или глупый вопрос.Как я могу заказать свои параметры ctor для DI/IOC?

Предположим, у меня есть форма, которая создает/обновляет заказ, и я знаю, что вам нужно будет отобразить список продуктов и клиентов для отображения. Я хочу передать объект Order, который он редактирует, но я также хочу, чтобы в качестве зависимостей были введены продукты ServiceService и CustomersService.

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

Должен ли я объявить конструктор как взятие объекта Order в качестве первого параметра и ProductsService и CustomersService после этого, например:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

... или если зависимости придет первый и последний объект Order, например:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

Имеет ли это значение? Это зависит от того, какой контейнер IoC я использую? Или есть «лучший» способ?

ответ

4

Я не согласен с ответом @ aku.

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

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

http://tech.puredanger.com/2007/09/18/spelunking/

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

5

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

Смешивание и нормальные аргументы усложняют логику вашей программы.

В этом случае было бы лучше, чтобы объявить свойство зависимостей (т.е. удалить зависимости от конструктора) или инициализировать порядок поля после того, как IoC построен БЛАНКА ЗАКАЗА и решен ее зависимость (т.е. удалить нормальные параметры из конструкторы).

Также вы можете объявить все свои параметры, в том числе заказать в качестве зависимостей.

+0

Хорошо, это имеет смысл. Таким образом, либо я использую инъекцию свойств для всех моих зависимостей, либо ТОЛЬКО передаю зависимости в ctor и вводит свойство для «необходимого» объекта? – 2008-10-01 05:22:15

+0

Да, ты прав. Не смешивайте DP и обычные свойства, поскольку это может привести к непредсказуемым проблемам и ограничить диапазон подходящих каркасов IoC. – aku 2008-10-01 05:27:22

3

Я чувствую себя немного неловко из-за возможности создания экземпляра OrderForm без ссылки на экземпляр заказа. Одна из причин может заключаться в том, что это помешает мне выполнить предварительную проверку нулевых заказов. Любые дальнейшие мысли?

Я полагаю, что я мог бы с уверенностью сказать, что объекты OrderForm будут создаваться только методом Factory, который гарантирует, что свойство Order задано после обращения к структуре IoC.