2

Привет, Я изучаю лучший способ сделать инъекцию зависимостей, а также использовать контейнеры IoC для разрешения зависимостей. однако для большинства примеров, которые я встретил в классе, нужен только один экземпляр класса зависимостей, и эта зависимость вводится в конструктор. Но мои сценарии немного отличаются. У меня есть класс с методом, который постоянно выполняет некоторую работу в цикле и foreach итерации в цикле, мне нужно создать новый экземпляр другого класса. Как мне сделать инъекцию зависимостей в этом сценарии? как разрешить контейнер IoC?Инъекция зависимостей, если классу необходимо создать несколько экземпляров другого класса, когда это необходимо в методе

Спасибо за ваше терпение

ответ

2

Как dkatzel сказал, используйте factory. Я так об этом и хожу. Если вы создавали экземпляры скажем, BaseViewModel:

public interface IViewModelFactory { 
    T Create<T>() where T : BaseViewModel; 
} 

public class ViewModelFactory : IViewModelFactory { 
    private readonly Dictionary<Type, Func<BaseViewModel>> _factories; 

    public ViewModelFactory(Dictionary<Type, Func<BaseViewModel>> factories) { 
     _factories = factories; 
    } 

    public T Create<T>() where T : BaseViewModel { 
     return _factories[typeof (T)]() as T; 
    } 
} 

Так что теперь у нас есть инъекционный завод, который может быть настроен, чтобы создать и вернуть все, что реализует BaseViewModel.

В IoC мы должны настроить типы вернуться так себе эти модели вида (и обратите внимание на зависимость во второй модели представления):

public abstract class BaseViewModel { 
    // ... 
} 

public class FirstViewModel : BaseViewModel { 
    // ... 
} 

public class SecondViewModel : BaseViewModel { 
    private readonly ISomeDependency _injectedDependency; 

    public SeoncdViewModel(ISomeDependency dependency) { 
     _injectedDependency = dependency; 
    } 
} 

А (с использованием Autofac) мы настраиваем его так:

var builder = new ContainerBuilder(); 

builder.Register(b => { 

    var factories = new Dictionary<Type, Func<BaseViewModel>> { 
     { typeof (FirstViewModel),() => new FirstViewModel() }, 
     { typeof (SecondViewModel),() => new SecondViewModel(b.Resolve<ISomeDependency>()) }, 
    }; 

    return new ViewModelFactory(factories); 

}).As<IViewModelFactory>(); 

и теперь мы можем внедрить IViewModelFactory и создавать экземпляры FirstViewModel или SecondViewModel:

public class SomeClass { 
    public readonly IViewModelFactory _factory; 

    public SomeClass(IViewModelFactory factory) { 
     _factory = factory; 

     var secondViewModel = _factory.Create<SecondViewModel>(); 
    } 
} 

Приятная часть состоит в том, что IoC обрабатывает все зависимости. SomeClass просто знает, что у него есть вещь, которая может создать SecondViewModel, поэтому SomeClass не нужно знать о зависимостях SecondViewModels.

+0

Благодарим вас за подробный ответ. – rakesh

2

впрыснуть экземпляр Factory который может создавать объекты, которые вы хотите:

void doLoop(){ 
for(;;){ 
    MyObj obj = factory.createNew(); 

    } 

} 
+0

Спасибо за быстрый ответ. У меня есть следующий сценарий, который [здесь] (http://stackoverflow.com/questions/25672179/class-structure-for-decoupling-and-dependency-injection-in-windows-service-with) вы можете прокомментировать это, пожалуйста? – rakesh

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