如何在 Prism 的 运行 时间注入新实例?
How to inject new instance at run time in Prism?
我正在为 WPF 应用程序使用 Prism 7.1。
我尝试使用内置的 IOC(Unity),但我不知道如何在 运行 时间从方法或 containerProvider 解析新实例。但似乎无法将 IContainerProvider 注入到我的视图模型中。我有什么选择吗?
我想重新加载我的数据库上下文。有人告诉我创建新上下文是最简单的。
public class ProjectViewModel : BindableBase
{
private UnitOfWork unitOfWork;
private IContainerProvider containerProvider;
private IEventAggregator eventAggregator;
#region Constructor
public ProjectViewModel(UnitOfWork unitOfWork, IContainerProvider cp, IEventAggregator ea)
{
this.unitOfWork = unitOfWork;
containerProvider = cp;
eventAggregator = ea;
eventAggregator.GetEvent<SendReloadDataEvents>().Subscribe(Reload);
Reload();
}
#endregion
private void Reload()
{
this.unitOfWork = containerProvider.Resolve<UnitOfWork>();
Projects = new ObservableCollection<Projects>(unitOfWork.ProjectRepo.GetAll());
Customers = new ObservableCollection<Customers>(unitOfWork.CustomerRepo.Find(x => x.Projects.Count > 0));
SelectedProjectType = null;
}
//Other logic continues
}
注入容器是一种反模式,所以我们会尽量避免这种情况,而是注入一个工厂。事实上,IContainerProvider
和 IContainerRegistry
并没有因为这个原因自行注册,因此无法注入它们。
虽然工厂很容易:
public class ProjectViewModel : BindableBase
{
private UnitOfWork unitOfWork;
private Func<UnitOfWork> unitOfWorkFactory;
private IEventAggregator eventAggregator;
#region Constructor
public ProjectViewModel(Func<UnitOfWork> unitOfWorkFactory, IEventAggregator ea) // no need to inject a unit of work
{
_unitOfWorkFactory = unitOfWorkFactory;
eventAggregator = ea;
ea.GetEvent<SendReloadDataEvents>().Subscribe(Reload); // prefer the parameter
Reload();
}
#endregion
private void Reload()
{
this.unitOfWork = _unitOfWorkFactory(); // create a new one here (the container does the work but is hidden)
Projects = new ObservableCollection<Projects>(unitOfWork.ProjectRepo.GetAll()); // I'd rather update the existing collection
Customers = new ObservableCollection<Customers>(unitOfWork.CustomerRepo.Find(x => x.Projects.Count > 0)); // same here, or probably, it could just be IEnumerable
SelectedProjectType = null;
}
//Other logic continues
}
请注意,此 Func<>
工厂仅适用于最简单的情况。如果您需要将参数传递到产品构造函数中,则必须按照 所述自行编写代码。还要注意容器如何永远不会出现在任何地方(除了配置它的地方),让你的代码依赖于容器是不必要的,并且会使测试更难看。
我正在为 WPF 应用程序使用 Prism 7.1。 我尝试使用内置的 IOC(Unity),但我不知道如何在 运行 时间从方法或 containerProvider 解析新实例。但似乎无法将 IContainerProvider 注入到我的视图模型中。我有什么选择吗?
我想重新加载我的数据库上下文。有人告诉我创建新上下文是最简单的。
public class ProjectViewModel : BindableBase
{
private UnitOfWork unitOfWork;
private IContainerProvider containerProvider;
private IEventAggregator eventAggregator;
#region Constructor
public ProjectViewModel(UnitOfWork unitOfWork, IContainerProvider cp, IEventAggregator ea)
{
this.unitOfWork = unitOfWork;
containerProvider = cp;
eventAggregator = ea;
eventAggregator.GetEvent<SendReloadDataEvents>().Subscribe(Reload);
Reload();
}
#endregion
private void Reload()
{
this.unitOfWork = containerProvider.Resolve<UnitOfWork>();
Projects = new ObservableCollection<Projects>(unitOfWork.ProjectRepo.GetAll());
Customers = new ObservableCollection<Customers>(unitOfWork.CustomerRepo.Find(x => x.Projects.Count > 0));
SelectedProjectType = null;
}
//Other logic continues
}
注入容器是一种反模式,所以我们会尽量避免这种情况,而是注入一个工厂。事实上,IContainerProvider
和 IContainerRegistry
并没有因为这个原因自行注册,因此无法注入它们。
虽然工厂很容易:
public class ProjectViewModel : BindableBase
{
private UnitOfWork unitOfWork;
private Func<UnitOfWork> unitOfWorkFactory;
private IEventAggregator eventAggregator;
#region Constructor
public ProjectViewModel(Func<UnitOfWork> unitOfWorkFactory, IEventAggregator ea) // no need to inject a unit of work
{
_unitOfWorkFactory = unitOfWorkFactory;
eventAggregator = ea;
ea.GetEvent<SendReloadDataEvents>().Subscribe(Reload); // prefer the parameter
Reload();
}
#endregion
private void Reload()
{
this.unitOfWork = _unitOfWorkFactory(); // create a new one here (the container does the work but is hidden)
Projects = new ObservableCollection<Projects>(unitOfWork.ProjectRepo.GetAll()); // I'd rather update the existing collection
Customers = new ObservableCollection<Customers>(unitOfWork.CustomerRepo.Find(x => x.Projects.Count > 0)); // same here, or probably, it could just be IEnumerable
SelectedProjectType = null;
}
//Other logic continues
}
请注意,此 Func<>
工厂仅适用于最简单的情况。如果您需要将参数传递到产品构造函数中,则必须按照