Using IoC inside an abstract factory template?

Is it wrong to use an IoC container inside a Factory template? eg:

public interface IDialogService { void RegisterView<TView, TViewModel>(string viewName) where TViewModel : IDialogViewModel where TView : Window; bool? ShowDialog(string viewName, IDialogViewModel viewModel); // factory method: TViewModel CreateDialogViewModel<TViewModel>(string name) where TViewModel : IDialogViewModel; } public class DialogService : IDialogService { private readonly IUnityContainer _container; public DialogService(IUnityContainer container) { _container = container; } #region IDialogService Members public void RegisterView<TView, TViewModel>() where TView : Window where TViewModel : IDialogViewModel { RegisterView<TView, TViewModel>(""); } public void RegisterView<TView, TViewModel>(string viewName) where TView : Window where TViewModel : IDialogViewModel { if (!_container.IsRegistered<TViewModel>()) _container.RegisterType<TViewModel>(); if (string.IsNullOrEmpty(viewName)) { viewName = typeof(TView).Name; } _container.RegisterType<Window, TView>(viewName); } public bool? ShowDialog(string viewName, IDialogViewModel viewModel) { var view = _container.Resolve<Window>(viewName); view.DataContext = viewModel; view.Owner = Application.Current.MainWindow; return view.ShowDialog(); } // factory method: public TViewModel CreateDialogViewModel<TViewModel>(string name) where TViewModel : IDialogViewModel { return _container.Resolve<TViewModel>(name); } #endregion } 

The reason I created the Factory method is because some of my IDialogViewModel implementations have a lot of parameters in their constructor, and every dialog must have a new UnitOfWork when creating the instance.

Here is how I use it:

 public class PeopleMainViewModel : NotificationObject, ... { private readonly IDialogService _dialogService = null; public PeopleMainViewModel(IDialogService dialogService) { _dialogService = dialogService; } // this method executes by a command. public void AddPerson() { // here is factory method usage. each time PersonDialogViewModel instantiates, a new Unit of work will be created. var viewModel = _dialogService.CreateDialogViewModel<PersonDialogViewModel>(); // this shows person dialog window to user... var result = _dialogService.ShowDialog("PersonWindow", viewModel); if(result == true) { //... } } } 
+4
source share
1 answer

You should try to avoid entering the IoC container in the factory, instead see if your IoC framework can generate a factory for you. However, this is not always possible, in such cases, I find it acceptable to use the container in the factory if it never escapes.

Personally, I would not put the container in the Service (as in the case above), since it seems to me that the class now has two responsibilities, and the injection infrastructure is hidden in the application logic.

+2
source

Source: https://habr.com/ru/post/1446939/


All Articles