没有静态类或方法的IoC容器

问题描述 投票:0回答:1

我想了解IoC容器的想法。我发现一些资料说IoC Container的静态类是个坏主意,但我找不到在这个容器中不使用静态的好例子。我试图自己解决这个问题,但没有结果。我在我的WPF应用程序中使用Unity IoC Container,但是我不需要使用IoC的视图和视图模型连接的帮助,因为我理解它。我想将一些注册的对象注入我的viewmodel的构造函数中:

public class MyViewModel
{
    private readonly IExceptionLogger _exceptionLogger;

    public MyViewModel(IExceptionLogger exceptionLogger)
    {
        _exceptionLogger = exceptionLogger;
    }
}

我的容器类:

public class Bootstrapper
{
    private readonly IUnityContainer _container;

    public Bootstrapper()
    {
        _container = new UnityContainer();
    }

    public void RegisterTypes()
    {
        _container.RegisterType<IExceptionLogger, ExceptionLogger>();
    }
}

现在,我被困住了。我希望如果我将它添加到我的App.xaml.cs中,ExceptionLogger的新实例将被发送到构造函数:

    protected override void OnStartup(StartupEventArgs e)
    {
        Bootstrapper bootstrapper = new Bootstrapper();
        bootstrapper.RegisterTypes();

        base.OnStartup(e);
    }

但是,遗憾的是没有发送任何内容。我知道我错过了什么,但我不知道是什么。

如果有人知道关于IoC Containers的非静态类的任何好文章,我将不胜感激。如果有人知道我的代码中有什么错过,请告诉我。

c# unity-container ioc-container
1个回答
3
投票

简而言之,除非有一些基础设施指示容器提供类型,否则不会自动发生任何事情。据我所知,这样的基础设施在WPF中并不存在,所以你需要手动完成或者使用MVVM框架来帮助你做到这一点(之前我使用过Caliburn.Micro,我相信他们的docs在解释事情方面做得相当不错,但我不能说我是他们在该框架中所做的一切的忠实粉丝。

如果你想手动操作以了解事情是如何工作的,你需要使用容器来构建你的类型(这是最简单的方法)。只需使用container.Resolve<IInterface>()来实现IInterface - 在你的情况下调用container.Resolve<IExceptionLogger>()将返回一个ExceptionLogger。当您使用具有其他注册接口的参数的构造函数注册类时,有趣的部分会出现 - 这样您就可以一次构建整个对象图。

在WPF中,您可以以类似Caliburn的方式注册视图和视图模型,然后使用一些将所有内容绑定在一起的基础结构。然后,只有包含基础结构的少数几个类才需要访问容器。我建议从一个MVVM框架开始,它可以为你提供大量的支持。

有关堆栈溢出的许多问题都广泛讨论了详细信息,例如Where to place and configure IoC container in a WPF application?

© www.soinside.com 2019 - 2024. All rights reserved.