Как 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
.
Благодарим вас за подробный ответ. – rakesh