Unity IOC 容器。如何从创建容器的范围之外的 IOC 容器中解析实例?

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

我是 IOC 容器的新手,我正在尝试了解如何使用它们。我理解这个概念,但我对如何实际应用它有疑问。目前,我正在使用 Unity ioc 容器为 Web api 包装类注册 RestClient 的实例,然后将所述实例注入到处理不同请求的类中。请参阅下面的代码:

var myClient = new RestClient();
var iocContainer = new UnityContainer();
iocContainer.RegisterInstance(myClient);
iocContainer.RegisterType<MyWrapperClass>(
new InjectionConstructor(iocContainer.Resolve<RestClient>()));

此代码发生在我的 wpf 应用程序的 OnStartup 文件中。如果我想获取已注册的对象,我知道我可以调用

iocContainer.Resolve<MyWrapperClass>()
但是,如果我如何在 Ioc 不存在的不同类中解析该对象?

希望我的解释是有道理的。如有任何帮助,我们将不胜感激。

wpf dependency-injection inversion-of-control unity-container ioc-container
2个回答
0
投票

使用 DI 容器的最佳方法是使用注册解决发布模式。您的代码库中应该有一行代码调用

container.Resolve
,而不是在整个代码库中调用
Resolve
。然后,这行代码组成了实现应用程序行为的整个对象图。

(实际上,您不需要 DI 容器来做到这一点,而且我认为 Pure DI 是解决同一问题的更简单的解决方案。)

当一个对象需要与另一个对象对话时,让它通过其构造函数请求依赖关系,例如:

public MainWindow(IDep dep) { /*...*/ }

我上次查看 WPF 已经有十年了,但我的书 .NET 中的依赖注入 的第一版有一个章节介绍了 WPF 组合(还有关于 Unity 的一章)。该版本还可以作为免费电子书与该书的最新版本一起提供。


0
投票

但是,如果我如何在 Ioc 不存在的不同类中解析该对象?

您需要以某种方式获取对容器的引用。

例如,您可以在

App
类中定义静态属性:

public partial class App : Application
{
    public static IUnityContainer Container { get; } = new UnityContainer();

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        var myClient = new RestClient();
        var iocContainer = Container;
        iocContainer.RegisterInstance(myClient);
        iocContainer.RegisterType<MyWrapperClass>(
            new InjectionConstructor(iocContainer.Resolve<RestClient>()));
    }
}

然后,您可以轻松解析应用程序中组件的类型,如下所示:

var wrapperClass = App.Container.Resolve<MyWrapperClass>();
© www.soinside.com 2019 - 2024. All rights reserved.