2015-01-15 3 views
1

У меня возникает сценарий, когда мое представление является формой Windows, поэтому после вызова его конструктора я хочу создать экземпляр Presenter класс. Мой ведущий имеет конструктор, который принимает два аргумента, один вид, а второй является хранилищем так:Как настроить структуру карты, если один параметр должен быть передан вручную, а второй должен быть разрешен.

Presenter(IView, IRepository)

Теперь в идеале я хочу, чтобы вид пройти себя в качестве первого параметра, но пусть StructureMap впрыснуть второй параметр. Так что с моей точки зрения я хочу вызвать другой конструктор класса Presenter с одним параметром

Presenter(IView)

и как-то сказать структуру карты, чтобы решить хранилище.

Я не уверен, что это возможно? Кто-нибудь сталкивался с подобным сценарием, и если да, то как мы справляемся с этим, не создавая зависимость от структуры DI?

Благодаря

ответ

0

Это звучит как ваш лучший выбор, чтобы впрыснуть экземпляр вашего StructureMap IContainer в вашу форму Windows, а затем решить Presenter класс как так (где viewParam строка имя вашего параметра на ваш Presenter класс):

... 
    public Form(IContainer container) 
    { 
     IPresenter presenter = container.With("viewParam").EqualTo(new YourView()).GetInstance<IPresenter>(); 
    } 
... 

StructureMap должны автоматически разрешить зависимость от параметра IRepository, если вы настроили его сделать это.

Редактировать

Другой вариант заключается в создании класса строитель и впрыснуть, что вместо этого. Класс строителя очень похож на заводский класс, который часто используется, когда зависимая, которую вы создаете, требует немного большей настройки, которая выходит за пределы рамки StructureMap. See this answer for an example.

+0

Спасибо Джо за ваш вклад, да мне это кажется последним вариантом. Если это единственный вариант в этом случае, чем было бы лучше, если бы я отрисовал контейнер DI через свой собственный интерфейс и назову что-то вроде IResolveDependencies.GetInstanceOf ()? Таким образом, фактический контейнер DI будет абстрагирован и может быть заменен любым фреймворком. –

+0

Да, это, безусловно, еще одна возможность. Один из вариантов, который я хотел бы упомянуть, - ввести класс строителя. Дополнительную информацию см. В моем обновленном ответе. –

+0

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

Смежные вопросы