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

C# 没有静态类或方法的IoC容器,c#,unity-container,ioc-container,C#,Unity Container,Ioc Container,我试图理解国际奥委会容器的概念。我发现一些消息来源说,为IoC容器使用静态类是个坏主意,但我找不到在这个容器中不使用静态类的好例子。我试着自己去弄清楚,但是没有结果。我在WPF应用程序中使用Unity IoC容器,但我不需要使用IoC进行视图和viewmodels连接的帮助,因为我理解它。我想将一些已注册的对象注入到我的viewmodel的构造函数中: public class MyViewModel { private readonly IExceptionLogger _except

我试图理解国际奥委会容器的概念。我发现一些消息来源说,为IoC容器使用静态类是个坏主意,但我找不到在这个容器中不使用静态类的好例子。我试着自己去弄清楚,但是没有结果。我在WPF应用程序中使用Unity IoC容器,但我不需要使用IoC进行视图和viewmodels连接的帮助,因为我理解它。我想将一些已注册的对象注入到我的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>();
    }
}
但是,不幸的是,没有向它发送任何信息。我知道我错过了什么,但我不知道是什么


如果有人知道关于IoC容器的非静态类的好文章,我将不胜感激。如果有人知道我在代码中遗漏了什么,请也告诉我。

简而言之,除非有一些基础设施指示容器提供类型,否则不会自动发生任何事情。据我所知,WPF中并没有现成的基础设施,所以您需要手动完成,或者使用MVVM框架来帮助您完成这项工作(我以前使用过Caliburn.Micro,我相信他们的文档在解释方面做得相当好,尽管我不能说我对他们在该框架中所做的每件事都很感兴趣)

如果您想手动操作以了解工作方式,则需要使用容器来构造类型(这是最简单的方法)。只需使用
container.Resolve()
即可获得IInterface的实现—在您的情况下,调用
container.Resolve()
将返回一个
异常日志。有趣的部分是,当您使用具有其他已注册接口参数的构造函数注册一个类时——这样您就可以一次性构建一个完整的对象图

在WPF中,您可以像Caliburn那样注册视图和视图模型,然后使用一点基础设施将所有内容绑定在一起。然后,只有构成基础设施的少数几个类需要访问容器。我建议从一个MVVM框架开始,它可以为您提供现成的解决方案


有关堆栈溢出的许多问题都广泛讨论了细节,例如简而言之,除非有一些基础设施指示容器提供类型,否则不会自动发生任何事情。据我所知,WPF中并没有现成的基础设施,所以您需要手动完成,或者使用MVVM框架来帮助您完成这项工作(我以前使用过Caliburn.Micro,我相信他们的文档在解释方面做得相当好,尽管我不能说我对他们在该框架中所做的每件事都很感兴趣)

如果您想手动操作以了解工作方式,则需要使用容器来构造类型(这是最简单的方法)。只需使用
container.Resolve()
即可获得IInterface的实现—在您的情况下,调用
container.Resolve()
将返回一个
异常日志。有趣的部分是,当您使用具有其他已注册接口参数的构造函数注册一个类时——这样您就可以一次性构建一个完整的对象图

在WPF中,您可以像Caliburn那样注册视图和视图模型,然后使用一点基础设施将所有内容绑定在一起。然后,只有构成基础设施的少数几个类需要访问容器。我建议从一个MVVM框架开始,它可以为您提供现成的解决方案


有关堆栈溢出的许多问题都广泛讨论了细节,例如

如果您的类是
MyViewModel
为什么您的构造函数名为
StartupVM
?对不起,我已经修复了它您的引导程序超出范围,并在启动方法退出后立即进行垃圾收集。静态类引用IoC容器以使其不超出范围是正常的。如果您的类是
MyViewModel
,为什么您的构造函数名为
StartupVM
?对不起,我已经修复了它您的引导程序超出范围,并在启动方法退出后立即进行垃圾收集。静态类引用IoC容器以使其不超出范围可能是正常的。谢谢,我使用的是MVVMLight框架,但我看到其中也有静态解决方案,所以这对我不好。我正在考虑改变框架或者自己写一些东西。在阅读了你们文章的主题后,我会进一步搜索。MVVMLight非常。。。嗯,光;我很久以前就用过它了,所以现在还不能肯定,但是我会更加自信地推荐另一个框架,直到你对所有的概念都非常熟悉。谢谢,我使用的是MVVMLight框架,但我发现其中也有静态解决方案,所以这对我不好。我正在考虑改变框架或者自己写一些东西。在阅读了你们文章的主题后,我会进一步搜索。MVVMLight非常。。。嗯,光;我很久以前就用过它了,所以现在还不能说,但是我会更有信心推荐另一个框架,直到你对所有的概念都非常熟悉为止。
    protected override void OnStartup(StartupEventArgs e)
    {
        Bootstrapper bootstrapper = new Bootstrapper();
        bootstrapper.RegisterTypes();

        base.OnStartup(e);
    }