我是 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 不存在的不同类中解析该对象?
希望我的解释是有道理的。如有任何帮助,我们将不胜感激。
使用 DI 容器的最佳方法是使用注册解决发布模式。您的代码库中应该有一行代码调用
container.Resolve
,而不是在整个代码库中调用 Resolve
。然后,这行代码组成了实现应用程序行为的整个对象图。
(实际上,您不需要 DI 容器来做到这一点,而且我认为 Pure DI 是解决同一问题的更简单的解决方案。)
当一个对象需要与另一个对象对话时,让它通过其构造函数请求依赖关系,例如:
public MainWindow(IDep dep) { /*...*/ }
我上次查看 WPF 已经有十年了,但我的书 .NET 中的依赖注入 的第一版有一个章节介绍了 WPF 组合(还有关于 Unity 的一章)。该版本还可以作为免费电子书与该书的最新版本一起提供。
但是,如果我如何在 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>();