Unity依赖注入容器的应用
定义:Unity Application Block (Unity)是一个轻量级、可扩展的依赖注入容器,所谓依赖注入容器,即组件之间的依赖关系由容器在运行期决定,容器动态的将某种依赖关系注入到组件之中,实现构建高度松耦合的软件的工具,依赖注入容器处理相互关联组件的所有细节,因此你可以构建一个独立的组件,提升组件重用的概率,为系统搭建一个灵活、可扩展的平台。
功能:它有助于构建松耦合的应用程序和为开发者提供以下便利:
1,它提供了创建(或者装配)对象实例的机制,简化对象的创建,特别在分层对象结构和依赖的情形下
2,它支持需求的抽象化,这允许开发人员在运行时或在配置文件中指定依赖,简化横切关注点(crosscutting concerns)的管理
3,它通过把组件配置推给容器来决定,增加了灵活性
4,服务定位能力;这使客户端能够存储或缓存容器
说明:其实说的白一点Unity是一个用来构建插件式系统的解决方案,我们的应用程序有各个功能模块组件组成,各个组件通过依赖关系与系统高度松耦合。在开发程序时只预留接口,让组件来继承这些接口实现功能,具体怎么实现的应用程序不管,有组件负责,应用程序只管调用接口,完成功能。
实例:下面的例子会让我们对Unity依赖注入容器有所了解
需求是这样的,我们的应用程序有一个日志模块,根据不同的需求和部署,我们来可能会把日志记录在不同的地方,如:文本、数据库。。。
1,定义日志接口类:
{
bool Append(string s);
}
2,记录日志到文本 实现类ILogger接口

/// 记录日志到文本中
/// </summary>
public class FileLogger : ILogger
{
public bool Append(string s)
{
//代码部分省略
throw new NotImplementedException();
}
}
3,记录日志到数据库 实现类ILogger接口
代码
/// 记录日志到数据库中
/// </summary>
public class DbLogger : ILogger
{
public bool Append(string s)
{
//代码部分省略
throw new NotImplementedException();
}
}
4,调用

{
static void Main(string[] args)
{
AddLog("程序已启动");
}
static public void AddLog(string log)
{
//创建容器
IUnityContainer myContainer = new UnityContainer();
//从配置文件中获取注入对象
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(myContainer);
//获取对象实例
ILogger logger = myContainer.Resolve<ILogger>();
//调用对象方法
logger.Append(log);
}
}
5,配置信息

<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container>
<types>
<!--<type type="UnityTest.ILogger,UnityTest" mapTo="UnityTest.FileLogger, UnityTest" />-->
<type type="UnityTest.ILogger,UnityTest" mapTo="UnityTest.DbLogger, UnityTest" />
</types>
</container>
</containers>
</unity>
</configuration>
日志怎么记录,记录在哪里主程序不关心,他只管调用就可以了,具体的日志实现功能有日志组件模块来完成,可以通过更改配置文件unity来注册使用的日志记录模块
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述