У меня есть два варианта создания фабрики ViewModel для внедрения в другие классы:
ОПЦИЯ A
public interface IFactory
{
ViewModelA CreateViewModelA(string data);
ViewModelB CreateViewModelB(string data);
}
public class MyFactory : IFactory
{
public MyFactory(){}
public ViewModelA CreateViewModelA(string data)
{
return new ViewModelA (data);
}
public ViewModelA CreateViewModelB(string data)
{
return new ViewModelB (data);
}
}
//register factory
container.RegisterType<IFactory, MyFactory>(new ContainerControlledLifetimeManager());
ОПЦИЯ B
public interface IFactory
{
T CreateViewModel<T>();
}
public class MyFactory : IFactory
{
public MyFactory(IUnityContainer unityContainer)
{
_container = unityContainer;
}
private IUnityContainer _container { get; set; }
public T CreateViewModel<T>()
{
return (T)this._container.Resolve<T>();
}
}
//register factory
var container = new UnityContainer();
container.RegisterType<IFactory, MyFactory>(new ContainerControlledLifetimeManager(), new InjectionConstructor(container));
//inject this where neccessary
ОПЦИЯ B кажется проще реализовать, однако я не уверен, правильно ли использовать контейнер таким способом. Я читал об анти-паттерне сервисного локатора, и в этой ситуации способ, которым я передал контейнер в конструктор другого класса, похоже, напоминает эту проблему. Так какой вариант я должен go для и если возможно, чтобы уточнить, почему?