介绍
控制反转是软件设计模式,开发人员不需要显示指定要实例化的具体类;而是,使用抽象类或接口来定义他/她想要的功能。这增加了解耦,允许在稍后阶段更改实际的具体类,或者根据某些标准动态选择。您不依赖于特定的实现,而是依赖于您的系统来为您提供一个合适的实现(您可以控制它,而不需要关心它是什么)。
所以,
var logger = new ConsoleLogger();
可以被
var logger = unity.Resolve
来替换,当然您必须告诉Unity任何生存具体的实例。
设置
重中之重:您需要有一个Unity容器,保存在您启动类的实例或静态字段中:
Internal static readonly IUnityContainer unity = new UnityContainer();
这就够了。IUnityContainer接口定义了UnityContainer的契约,它本身是由UnityContainer类实现的。请更改可见性以满足您的要求,但尽量限制它。您很可能只需要一个统一容器的实例。稍后,我们将看到一种以间接的、更解耦的方式访问Unity的模式。
由于IUnityContainer实现了IDisposable,所以在Using块中始终创建子容器是一个很好的原则,以便在不再需要时正确地处理它们。
子容器与父容器IUnityContainer公开相同的接口,父容器具有父属性,但不跟踪其子容器。会出现在Web应用程序请求中。
稍后,当我们讨论UnityIntroduction与Introduction的集成时,我们将看到Microsoft堆栈中的一些技术使用IoC。
事实上,每次推出新版本或新技术时,它的数量似乎都在增长。通常可以插入所选的IoC容器;在我们的例子中,让我们看看如何使用Unity。
重要的是要记住,根据其配置(在生命周期管理器部分中将有更多的内容),Unity容器可能会自动地释放已注册的类型;要使这种情况发生,必须显式地处理它。在这种情况下,这样做可能更有意义:
Using(var unity=new UnityContainer())
{….
}
域模型
为了简化,我使用了简单的类模型:

这里我们有一个ILogger接口,它定义了我们的日志记录契约和两个具体的实现:ConsoleLogger,它记录到控制台和FileLogger,它记录到磁盘中的一个文件。让我们忘记这些类的实际实现;这并不重要。