c# - IoC - 使用注入(inject)的对象参数解析 WPF 窗口

标签 c# wpf dependency-injection inversion-of-control dryioc

我第一次尝试使用 IoC 容器。程序有许多不同类型的窗口,通常通过 MainWindow 中的菜单打开。然而,原则上它也可以在链条的更下游。这些窗口通常需要注入(inject)一个或多个单例类,让我们在这里将它们命名为IManager1/2/3。那么,我是否需要通过 MainWindow 向上冒泡这些 IManager,或者我可以在根处解析每个窗口(此处在 App 类 中)吗?

无论哪种情况,这将如何完成?

我不需要使用 DryIoc,但这正是我选择测试的。

   public partial class App : Application
{
    DryIoc.Container container = new DryIoc.Container();

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        RegisterIoc();

        var mainwindow = new MainWindow(); 
        mainwindow.Show();
    }

    public void RegisterIoc()
    {
        container.Register<IManager1, Manager1>(Reuse.Singleton);
        container.Register<IManager2, Manager2>(Reuse.Singleton);
        container.Register<IManager3, Manager3>(Reuse.Singleton);
    }
}

public MainWindow()
{
    public MainWindow()
    {
    }

    void OpenNewWindow2()
    {
        var w = new Window2(?, ?, ?);
        w.Show();
    }
}

public class Window2
{
    IManager1 man1;
    IManager2 man2;
    IManager3 man3;

    public Window2(IManager1 man1, IManager2 man2, IManager3 man3)
    {
        this.man1 = man1;
        this.man2 = man3;
        this.man3 = man3;
    }
}

最佳答案

考虑遵循显式依赖原则并制作Window2 MainWindow 的依赖项

例如

public class MainWindow {
    private readonly Func<Window2> window2;

    public MainWindow(Func<Window2> window2) {
        this.window2 = window2;
    }

    public void OpenNewWindow2() {
        var window = window2(); // invoke factory delegate
        window.Show();
    }
}

上面显示了 Func<T> 的使用作为工厂委托(delegate),它将充当所需依赖项的延迟解析的包装器。每次调用工厂委托(delegate)时,它都会解析 Window2 的新实例。 ,反转 MainWindow 的控制必须手动初始化它;

App.Application_Startup用作组合根,您可以在其中向容器注册所有内容并解析 MainWindow ,你的根对象

public partial class App : Application {
    DryIoc.Container container;

    private void Application_Startup(object sender, StartupEventArgs e) {
        container = RegisterIoc();    
        var mainwindow = container.Resolve<MainWindow>(); 
        mainwindow.Show();
    }

    private DryIoc.Container RegisterIoc() {
        var container = new DryIoc.Container();
        container.Register<MainWindow>();
        container.Register<Window2>();
        container.Register<IManager1, Manager1>(Reuse.Singleton);
        container.Register<IManager2, Manager2>(Reuse.Singleton);
        container.Register<IManager3, Manager3>(Reuse.Singleton);
        return container;
    }
}

请注意,要解析窗口,您还需要确保它们也已注册到容器中。

关于c# - IoC - 使用注入(inject)的对象参数解析 WPF 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56892773/

相关文章:

c# - Lambda 表达式仅从集合中选择某些项目

c# - 与 ViewModel 绑定(bind)的 MVVM 动态菜单 UI

c# - 无法使用 Unity 创建接口(interface)实例

c# - 如何添加动态控件而不是静态控件?

dependency-injection - 可以从 ASP.NET Core 项目中的 Simple Injector 注入(inject) IAsyncActionFilter 吗?

.net - 是否有类似 Ninject 提供程序的 Autofac 提供程序?

c# - 使用 .NET 和 C# 的 MongoDB 代码片段

c# - 用 Linq 拼接 IEnumerable

c# - 为什么我的 C# 组合框中插入了 3 个值,而不是 1 个?

c# - 如何在SQL Server数据库中存储图像