.NET开源项目介绍及资源推荐:IOC容器篇

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
关于IOC的概念就不多说了,在.NET平台下,比较优秀的IOC容器框架有如下四种,本文试图作一个简单的介绍,以及推荐一些各个框架的学习资源。

一.Castle

Castle中包含了一组开发框架,它里面的IOC容器是Windsor,目前Castle已经发布了RC1版本,其中Windsor已经是RC3了。在Windsor中提出了自动装配的概念,由容器来自动管理组件之间的依赖关系,无需用户去编写XML配置文件或者通过Attribute来指定容器之间的依赖关系。这样在使用上非常的简单,同时也带了一些问题,作为开发人员的我们无法控制组件的依赖关系。如下面的XML配置文件,仅仅是设定了组件的参数而已:
None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif  
< components >
None.gif
None.gif    
< component  id ="myMainComponent" >
None.gif
None.gif      
< parameters >
None.gif
None.gif        
< i > 1 </ i >
None.gif
None.gif      
</ parameters >
None.gif
None.gif    
</ component >
None.gif
None.gif  
</ components >
None.gif
None.gif
</ configuration >
简单的使用:
None.gif public   class  App
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public static void Main()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        IWindsorContainer container 
= new WindsorContainer(new XmlInterpreter("[url]http://www.cnblogs.com/BasicUsage.xml[/url]"));
InBlock.gif
InBlock.gif        container.AddComponent(
"myMainComponent",
InBlock.gif
InBlock.gif            
typeof(MyMainComponent));
InBlock.gif
InBlock.gif        container.AddComponent(
"myComponent1",
InBlock.gif
InBlock.gif            
typeof(MyComponent1));
InBlock.gif
InBlock.gif        container.AddComponent(
"myComponent2",
InBlock.gif
InBlock.gif            
typeof(MyComponent2));
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}
学习资源:

叶子的家:[url]http://wj.cnblogs.com/[/url][中文]

TerryLee Castle系列:

Ayende 一篇非常棒的文章:[url]http://msdn2.microsoft.com/en-us/library/aa973811.aspx[/url][英文]


二.Spring.NET

Spring.NET 是从javaSpring Framework移植过来的,现在版本应该是Spring.NET 1.0.2。正好和前面说的Castle相反,Spring.NET推崇做法是使用配置文件来管理组件之间的依赖关系,当然它也支持自动装配,不过不推荐使用。这样使用配置文件的方式,带来的问题是当项目非常大的时候,配置文件会非常的繁琐,手工配置会变得很复杂,如下面的配置文件,需要指定每一个组件以及它们之间的依赖关系:
None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif  
< object  id ="myManComponent"  class ="CastleDemo.MyMainComponent, CastleDemo" >
None.gif
None.gif    
< constructor-arg >
None.gif
None.gif      
< ref  object ="mycomponent1"   />
None.gif
None.gif    
</ constructor-arg >
None.gif
None.gif    
< constructor-arg >
None.gif
None.gif      
< ref  object ="mycomponent2"   />
None.gif
None.gif    
</ constructor-arg >
None.gif
None.gif    
< constructor-arg >
None.gif
None.gif      
< value > 1 </ value >
None.gif
None.gif    
</ constructor-arg >
None.gif
None.gif  
</ object >
None.gif
None.gif  
< object  id ="mycomponent1"  class ="CastleDemo.MyComponent1, CastleDemo"   />
None.gif
None.gif  
< object  id ="mycomponent2"  class ="CastleDemo.MyComponent2, CastleDemo"   />
None.gif
None.gif
</ configuration >
学习资源:


三.ObjectBuilder

ObjectBuilder ,只看其名字就知道是用来构造对象的,是由微软模式与实践小组最早开发并使用在CAB,因为表现出色,后来在Enterprise Library中也使用它来负责对象的创建工作,因为OB可以说是微软的IOC容器,它也是一个轻量级的IOC框架。它与前面介绍的Spring.NET很多相似的地方,需要显式的通过Attribute来指定对象之间的依赖关系,如下面来自于idior给出的代码片断:
None.gif public   class  SimpleNewsletterService : INewsletterService
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
private IEmailSender _sender;
InBlock.gif
InBlock.gif    
private ITemplateEngine _templateEngine;
InBlock.gif
InBlock.gif    
public SimpleNewsletterService(
InBlock.gif
InBlock.gif              [Dependency(CreateType 
= typeof(SmtpEmailSender))]
InBlock.gif
InBlock.gif               IEmailSender sender,
InBlock.gif
InBlock.gif             [Dependency(CreateType 
= typeof(NVelocityTemplateEngine))] 
InBlock.gif
InBlock.gif               ITemplateEngine templateEngine)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
InBlock.gif        _sender 
= sender;
InBlock.gif
InBlock.gif        _templateEngine 
= templateEngine;
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public void Dispatch(String from, String[] targets, String message)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
InBlock.gif        String msg 
= _templateEngine.Process(message);
InBlock.gif
InBlock.gif        
foreach (String target in targets)
InBlock.gif
ExpandedSubBlockStart.gif        
{
InBlock.gif
InBlock.gif            _sender.Send(from, target, msg);
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}
学习资源:

Niwalker ObjectBuilder技术内幕:[url]http://blog.csdn.net/niwalker/category/18174.aspx[/url][中文]

Idior EnterLib ObjectBuild vs Castle WindsorContainer[url]http://www.cnblogs.com/idior/archive/2006/08/15/ObjectBuildvsCastle.html[/url][中文]


四.StructureMap

前面介绍的三个大家可能都比较熟悉了,这最后一个估计关注的人就比较少了。StructureMap也是.NET环境下的一个轻量级依赖注入工具,StructureMap是一个灵活的、可扩展的通用“插件”机制的.NET IOC框架,支持.NET1.12.0。它与Spring.NET比较类似,但是它只支持使用Attribute的方式,而不能通过XML文件来配置,这样虽然显得不够灵活,但是它避免了项目比较大时XML文件的繁琐问题。如下面代码片断所示:
None.gif [Pluggable( " SQL " )]
None.gif
None.gif
public   class  SqlDataSource : IDataSource
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
private readonly string _sql;
InBlock.gif
InBlock.gif    
private readonly IDatabase _database;
InBlock.gif
InBlock.gif    
public SqlDataSource(IDatabase database, string sql)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif          _sql 
= sql;
InBlock.gif
InBlock.gif          _database 
= database;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public DataTable FetchTable()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
InBlock.gif          
return _database.FetchDataTable(_sql);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif[Pluggable(
" Email " )]
None.gif
None.gif
public   class  EmailAction : IAction
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
ExpandedSubBlockStart.gif    
public EmailAction(string to, string body){…}
InBlock.gif
ExpandedSubBlockStart.gif    
public void Process(DataTable table){…}
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif[Pluggable(
" Daily " )]
None.gif
None.gif
public   class  DailyScheduler : IScheduler
None.gif
ExpandedBlockStart.gif
{
ExpandedSubBlockStart.gif    
public DailyScheduler(){}
InBlock.gif
ExpandedSubBlockStart.gif    
public DateTime GetNextRunTime(DateTime currentTime){…}
InBlock.gif
ExpandedBlockEnd.gif}
学习资源:

现在只能参考官方文档了,还没有好的中文文档。

 

总结

以上简单介绍了.NET平台下四种不错的IOC容器框架,具体在项目中使用哪一个,就是仁者见仁,智者见智了,不过我个人仍然比较推崇Castle










本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67590  ,如需转载请自行联系原作者
相关文章
|
1月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
2月前
|
XML Java 数据格式
Spring IoC容器初始化过程(xml形式)
Spring IoC容器初始化过程(xml形式)
46 0
|
1月前
|
存储 前端开发 Java
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
|
1月前
|
XML Java 数据格式
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (下)
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界
|
1月前
|
XML Java 数据格式
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (上)
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (上)
|
2月前
|
Kubernetes Linux 调度
「译文」深入了解 Kubernetes 指标 - 第三部分 - 容器资源指标
「译文」深入了解 Kubernetes 指标 - 第三部分 - 容器资源指标
|
3月前
|
XML Java 数据格式
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
31 1
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
5天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
10 0
|
14天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
13 0