没有服务定位器的多实例的依赖注入

时间:2018-12-07 16:21:02

标签: c# dependency-injection multiple-instances service-locator

我正在使用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是一种反模式,我不会使用它。

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

1 个答案:

答案 0 :(得分:1)

尝试使用TransientLifetimeManager注册您的ISecondWindow。

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