【问题标题】:IoC Container without static class or methods没有静态类或方法的 IoC 容器
【发布时间】:2018-06-14 09:46:28
【问题描述】:

我正在尝试了解 IoC 容器的概念。我发现一些消息来源说 IoC 容器的静态类是个坏主意,但我找不到在这个容器中不使用静态的好例子。我试图自己弄清楚,但没有任何结果。我在我的 WPF 应用程序中使用 Unity IoC Container,但我不需要使用 IoC 连接视图和视图模型的帮助,因为我理解它。我想将一些注册对象注入到我的视图模型的构造函数中:

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 容器的非静态类的好文章,我将不胜感激。如果有人知道我的代码中遗漏了什么,请告诉我。

【问题讨论】:

  • 如果你的类是MyViewModel 为什么你的构造函数命名为StartupVM
  • 对不起,我已经修好了
  • 您的引导程序超出范围并在您的启动方法退出后立即收集垃圾。
  • IoC 容器被静态类引用是正常的,这样它就不会超出范围。

标签: c# unity-container ioc-container


【解决方案1】:

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

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

在 WPF 中,您可以以与 Caliburn 类似的方式注册视图和视图模型,然后拥有一些将所有内容绑定在一起的基础结构。然后只有构成基础设施的那几个类需要访问容器。我建议您从开箱即用的 MVVM 框架开始为您处理大量此类问题。

细节在很多关于堆栈溢出的问题中都有广泛讨论,例如Where to place and configure IoC container in a WPF application?

【讨论】:

  • 谢谢,我正在使用 MVVMLight 框架,但我看到那里也有静态解决方案,所以对我不利。我正在考虑改变框架或自己写一些东西。在阅读您帖子中的主题后,我将进一步搜索。
  • MVVMLight 非常……嗯,很轻;我很久以前就用过它,所以现在不能说,但我会更有信心推荐另一个框架,直到你对所有概念都非常熟悉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多