0

Ребята Мне нужна ваша помощь Я использую контейнер проекта Windsor IoC в моем приложении C# Winforms. У меня есть классы сервисов, у которых DI с помощью конструктора, проходящего в реализации Репозиториев. Я использовал Windsor, чтобы зарегистрировать их все Component.Register (... и т. Д., Но каждый раз, когда я использую свой класс обслуживания, я вызываю решение. Например:
var employeeService = container.Resolve....etc
есть ли другой способ не звонить все время? в ASP.NET вы можете просто зарегистрировать их затем установите контроллер завод:.
ControllerBuilder.Current.SetControllerFactory(new WindsorIoCFactory());
с этим я могу просто использовать мои контроллеры (с использованием услуг) непосредственно без вызова решительности, как вы это делаете в WinFormsWindsor Ioc во избежание вызова все время

+0

Я думаю, что это [ответ] (http://stackoverflow.com/a/4840907/1346943) должен помочь вам –

ответ

1

вас? следует использовать подход Composition Root.

Одним словом, вы должны использовать Решайте только один раз в App-StartUp, в основном разрешая MainView, и через это вы сможете получить все виды (скорее всего, через TypedFactory) и их зависимости без явного вызова Resolve.

Подход локатора сервисов, как и ссылка на комментарий, является отталкивающим анти-шаблоном, особенно если вместо него можно использовать Корень композиции.

На виндзорской вики вы найдете образец, основанный на Silverlight app, очень близком к сценарию Winform.

+0

Спасибо Криштиану! будет проверять состав Root – Patrick87

+0

Привет, Криштиану. Если у меня есть много сервисов, скажите сотруднику, клиенту ..etc и зарегистрируйте их все в начале или в основном методе в winforms, который действует как корень композиции, у меня нет проблемы, но где я должен поместить мой экземпляр контейнера? это должно быть место, подобное основному, или оно должно быть статичным, когда я могу назвать его глобально для правильного разрешения? oh, и есть еще одна вещь, например, фабрика Resolve? Так что я не буду ссылаться (используя [namespace]) в каждом файле .cs, который я вызываю? – Patrick87

+0

Прочтите это http://mookid.dk/oncode/archives/1854, вы должны получить все свои ответы ... плюс образец silverlight из вики, как указано выше. Но да, ваш контейнер должен быть похоронен как частная переменная в классе «Main»/StartUp, и никто извне не должен обращаться к нему напрямую или через ServiceLocator, ака «зло» (cit. Krzysztof Koźmic) :-) – Crixo

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