我正在使用Unity作为Ioc进行WPF应用程序的依赖注入
我用以下方法创建主窗口:
container.RegisterType<IMainWindow, MainWindow>();
container.RegisterType<ISecondWindow, SecondWindow>();
container.Resolve<IMainWindow>().Show();
所有其他窗口都注入了依赖注入,例如,在我的“ MainWindow”中,我可以通过“ SecondWindow”中的一个按钮打开,因此我在MainWindow构造函数中具有ISecondWindow。
public partial class MainWindow: Window, IMainWindow
{
public MainWindow(IMainWindowViewModel viewModel, ISecondWindow secondWindow)
{
//with this solution I can open the second window from IMainWindowViewModel (viewmodels has no reference to windows which are in a separate project)
viewModel.OpenSecondWindow += (s,e) => secondWindow.Show();
}
SecondWindow没有其他窗口,因此在其构造函数中仅定义了ViewModels
public partial class SecondWindow: Window, ISecondWindow
{
public SecondWindow(ISecondWindowViewModel viewModel)
然后所有的依赖项都以级联方式解决(WINDOW-> VIEWMODEL-> SERVICE-> REPOSITORY)
这非常有效,直到我只有第二个窗口的一个实例,但是...
如果我可以同时打开N个窗口/我的ISecondWindow实例怎么办(例如,我有一个列表,我双击第一行,然后打开具有第一行详细信息的ISecondWindow,然后我双击第二行行和另一个ISecondWindow是打开的,其中包含第二行的详细信息(因此我可以同时查看第一行和第二行的详细信息)?
使用DI不能实现,因为我拥有ISecondWindow,并且只能使用它的一个实例。
我认为解决此问题的唯一方法是使用Service locator,但是Service locator是一种反模式,我不会使用它。
您有什么想法/建议来解决这个问题吗?
答案 0 :(得分:1)
尝试使用TransientLifetimeManager注册您的ISecondWindow。
http://www.tutorialsteacher.com/ioc/lifetime-manager-in-unity-container