2017-02-21 3 views
0

У меня есть приложение Winforms, который использует Autofac для IoC/DIКак я могу получить текущий Autofac lifecyclescope и разрешить вложенные формы в Winform приложение

У меня есть настройки конфигурации autofac поэтому все формы могут быть решены через контейнер/ЛВП.

Я хочу внедрить каждую связанную с Winform информацию через инсталляцию конструктора.

Так что в моем приложении программы я создаю контейнер и корневой lifecyclescope и решить главную форму:

using (Autofac.IContainer container = Startup.Autofac.Initialize()) 
{ 
    FormFactory winfactory = FormFactory.Init(container); 
    var form = FormFactory.CreateForm<Form1>(); 
    Application.Run(form); 
} 

Это работает, как ожидалось, и мои услуги получают инъекции хорошо.

Теперь для взаимодействия с пользователем в основной форме требуется открытие новой формы. Поэтому основной форме необходимо разрешить и показать форму детали. Я хотел бы сделать это на текущем lifetimecope mainform, но я не знаю, как получить ссылку на него!

В MVC это похоже на интеграцию MVC/Autofac в пакетах Nuget, используя DependencyResolver.Current. Но это не доступно вне приложений MVC.

Может ли кто-нибудь быть любезным оказать мне некоторую помощь в этом и, в конечном итоге, некоторые рекомендации по разрешению вложенных форм в приложении Winforms?

Благодаря

ответ

0

Там нет официальной интеграции для Autofac в приложении WinForms. В приложении Winforms нет встроенной концепции запроса/ответа или «жизненного цикла запроса». Winforms имеет статус stateful, и интеграция в приложение выполняется на основе каждого приложения.

Что это значит - и я знаю, что это не будет ответ, который вы хотите, но это является ответ - это то, что вы должны написать интеграции Autofac в приложение пользовательские Winforms.

Возможно, вам понадобится добавить Microsoft CommonServiceLocator package в ваше приложение, которое в основном обеспечивает реализацию DependencyResolver для общих типов приложений. Autofac has integration with CommonServiceLocator.

Однако, имейте в виду, что Autofac отслеживает (IDisposable одноразовые реализаций), так что если вы разрешения вещи прямо из корневого контейнера вы можете столкнуться с утечкой памяти - то Disposables выполняются из корневого контейнера, по умолчанию, выиграл Не размещайте , пока не уничтожаете контейнер. There is documentation on controlling scope and lifetime for components.

Что это значит, вы хотите создать Autofac lifetime scopes и разрешить их, избавив от дочерних областей для очистки. Вот как работают службы MVC в течение каждого запроса (and there's doc on that, too).

Помимо этого, нет «лучшей практики» или «руководства», которое я могу предоставить. Нет никакого корня композиции - нет встроенных DI-крючков - в Winforms, так что действительно, действительно app-specific. Я не могу сказать, что что-то «хорошо» или «рекомендуется» для вашего приложения. Я не могу сказать, что что-то «нехорошо» или «плохая практика». Это все зависит от приложения, и вам придется делать эту работу.

+0

Большое спасибо. Но менее хорошие новости, чем я бы надеялся ... –

+0

Большое спасибо Travis за ваш совет по этому вопросу. Но менее хорошие новости, чем я бы надеялся ... К сожалению, очень сложно найти достойные советы о том, как правильно интегрировать Autofac в приложения Winform. Жаль, так как это место, где вам нужно быть экспертом в IoC и Autofac, чтобы убедиться, что вы не вводите патчи памяти или неправильные шаблоны с низкой производительностью в результате. Но я рассмотрю пакет CommonServiceLocator, как вы предлагаете. Еще раз спасибо .. –

+0

Не забудьте принять ответ :) –

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