首页 > 解决方案 > 没有服务定位器的多个实例的依赖注入

问题描述

我正在编写一个 WPF 应用程序,使用 Unity 作为 Ioc 进行依赖注入

我创建我的主窗口:

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)

在我只有第二个窗口的一个实例之前,这完全有效,但是......

如果我可以同时打开我的 ISecondWindow 的 N 个窗口/实例(例如,我有一个列表,我双击第一行并且 ISecondWindow 以第一行详细信息打开,然后我双击第二行和另一个ISecondWindow 以第二行详细信息打开(因此我可以同时查看第一行和第二行详细信息))?

使用 DI 无法做到这一点,因为我拥有并且只能使用我的 ISecondWindow 的一个实例。

我想解决这个问题的唯一解决方案是使用服务定位器,但服务定位器是一种反模式,我不会使用它。

你有什么想法/建议来解决这个问题吗?

标签: c#dependency-injectionmultiple-instancesservice-locator

解决方案


尝试使用 TransientLifetimeManager 注册您的 ISecondWindow。

http://www.tutorialsteacher.com/ioc/lifetime-manager-in-unity-container


推荐阅读