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

关于IOC的概念就不多说了,在.NET平台下,比较优秀的IOC容器框架有如下四种,本文试图作一个简单的介绍,以及推荐一些各个框架的学习资源。

一.Castle

Castle中包含了一组开发框架,它里面的IOC容器是Windsor,目前Castle已经发布了RC1版本,其中Windsor已经是RC3了。在Windsor中提出了自动装配的概念,由容器来自动管理组件之间的依赖关系,无需用户去编写XML配置文件或者通过Attribute来指定容器之间的依赖关系。这样在使用上非常的简单,同时也带了一些问题,作为开发人员的我们无法控制组件的依赖关系。如下面的XML配置文件,仅仅是设定了组件的参数而已:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  
<components>

    
<component id="myMainComponent">

      
<parameters>

        
<i>1</i>

      
</parameters>

    
</component>

  
</components>

</configuration>

简单的使用:

public class App

{
    
public static void Main()

    
{
        IWindsorContainer container 
= new WindsorContainer(new XmlInterpreter("http://www.cnblogs.com/BasicUsage.xml"));

        container.AddComponent(
"myMainComponent",

            
typeof(MyMainComponent));

        container.AddComponent(
"myComponent1",

            
typeof(MyComponent1));

        container.AddComponent(
"myComponent2",

            
typeof(MyComponent2));

    }


}

官方主页:http://www.castleproject.org/

学习资源:

官方文档:http://www.castleproject.org/container/documentation/v1rc3/index.html

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

TerryLeeCastle系列:

http://terrylee.cnblogs.com/archive/2006/04/28/castl_ioc_article.html[中文]

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


二.Spring.NET

Spring.NET是从javaSpring Framework移植过来的,现在版本应该是Spring.NET 1.0.2。正好和前面说的Castle相反,Spring.NET推崇做法是使用配置文件来管理组件之间的依赖关系,当然它也支持自动装配,不过不推荐使用。这样使用配置文件的方式,带来的问题是当项目非常大的时候,配置文件会非常的繁琐,手工配置会变得很复杂,如下面的配置文件,需要指定每一个组件以及它们之间的依赖关系:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  
<object id="myManComponent" class="CastleDemo.MyMainComponent, CastleDemo">

    
<constructor-arg>

      
<ref object="mycomponent1" />

    
</constructor-arg>

    
<constructor-arg>

      
<ref object="mycomponent2" />

    
</constructor-arg>

    
<constructor-arg>

      
<value>1</value>

    
</constructor-arg>

  
</object>

  
<object id="mycomponent1" class="CastleDemo.MyComponent1, CastleDemo" />

  
<object id="mycomponent2" class="CastleDemo.MyComponent2, CastleDemo" />

</configuration>

官方主页:http://www.springframework.net/

学习资源:

官方文档:http://www.springframework.net/documentation.html[英文]

雨痕的几篇文章:http://www.rainsts.net/default.asp?cat=13

ZhuzlSpring.NET系列:http://blog.csdn.net/zlz_212/category/241716.aspx


三.ObjectBuilder

ObjectBuilder,只看其名字就知道是用来构造对象的,是由微软模式与实践小组最早开发并使用在CAB,因为表现出色,后来在Enterprise Library中也使用它来负责对象的创建工作,因为OB可以说是微软的IOC容器,它也是一个轻量级的IOC框架。它与前面介绍的Spring.NET很多相似的地方,需要显式的通过Attribute来指定对象之间的依赖关系,如下面来自于idior给出的代码片断:

public class SimpleNewsletterService : INewsletterService

{
    
private IEmailSender _sender;

    
private ITemplateEngine _templateEngine;

    
public SimpleNewsletterService(

              [Dependency(CreateType 
= typeof(SmtpEmailSender))]

               IEmailSender sender,

             [Dependency(CreateType 
= typeof(NVelocityTemplateEngine))] 

               ITemplateEngine templateEngine)

    
{

        _sender 
= sender;

        _templateEngine 
= templateEngine;

    }


    
public void Dispatch(String from, String[] targets, String message)

    
{

        String msg 
= _templateEngine.Process(message);

        
foreach (String target in targets)

        
{

            _sender.Send(from, target, msg);

        }


    }


}

官方主页:http://msdn.microsoft.com/practices/

学习资源:

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

浪子学编程系列:http://www.cnblogs.com/walkingboy/category/54596.html[中文]

IdiorEnterLib ObjectBuild vs Castle WindsorContainerhttp://www.cnblogs.com/idior/archive/2006/08/15/ObjectBuildvsCastle.html[中文]


四.StructureMap

前面介绍的三个大家可能都比较熟悉了,这最后一个估计关注的人就比较少了。StructureMap也是.NET环境下的一个轻量级依赖注入工具,StructureMap是一个灵活的、可扩展的通用“插件”机制的.NET IOC框架,支持.NET1.12.0。它与Spring.NET比较类似,但是它只支持使用Attribute的方式,而不能通过XML文件来配置,这样虽然显得不够灵活,但是它避免了项目比较大时XML文件的繁琐问题。如下面代码片断所示:

[Pluggable("SQL")]

public class SqlDataSource : IDataSource

{
    
private readonly string _sql;

    
private readonly IDatabase _database;

    
public SqlDataSource(IDatabase database, string sql)

    
{
          _sql 
= sql;

          _database 
= database;
    }


    
public DataTable FetchTable()

    
{

          
return _database.FetchDataTable(_sql);

    }


}


[Pluggable(
"Email")]

public class EmailAction : IAction

{

    
public EmailAction(string to, string body){…}

    
public void Process(DataTable table){…}

}


[Pluggable(
"Daily")]

public class DailyScheduler : IScheduler

{
    
public DailyScheduler(){}

    
public DateTime GetNextRunTime(DateTime currentTime){…}

}

项目主页:http://structuremap.sourceforge.net/Default.htm

学习资源:

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

 

总结

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

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-12-01 08:51 TerryLee 阅读(12638) 评论(29)  编辑 收藏 网摘 所属分类: [12]  开源世界[09]  依赖注入

  回复  引用    
#1楼2006-12-01 09:01 | ddee[未注册用户]
.net的ioc容器选择真少,主流产品中两、三年过去了,就多了一个ObjectBuilder进入大家的视线,唉~~~~~~~~~

顺便推广一下caslte是不错的东东,terrylee的castle系列文章也很不错,给我们带来了很多帮助^_^

  回复  引用    
#2楼2006-12-01 09:01 | 海上漫步[匿名][未注册用户]
学习中…
  回复  引用  查看    
#3楼2006-12-01 09:04 | 西门子乌      
Spring.Net的版本是1.0.2,过一两天会出1.1p3
  回复  引用  查看    
#4楼[楼主]2006-12-01 09:05 | TerryLee      
@ddee
谢谢:)

值得选择也就这几种了,呵呵

  回复  引用  查看    
#5楼[楼主]2006-12-01 09:05 | TerryLee      
@海上漫步[匿名]
:)

  回复  引用  查看    
#6楼[楼主]2006-12-01 09:06 | TerryLee      
@西门子乌
谢谢,是我搞错了,呵呵

我改一下

  回复  引用    
#7楼2006-12-01 09:19 | 张豪[匿名][未注册用户]
那位大哥能把这篇文章翻译一下?
Ayende的文章:http://msdn2.microsoft.com/en-us/library/aa973811.aspx[英文],Terrylee帮忙宣传宣传 呵呵 !

  回复  引用  查看    
#8楼[楼主]2006-12-01 09:30 | TerryLee      
@张豪[匿名]
嗯,这篇文章非常好:)

// 我已经在文章中宣传了

  回复  引用    
#9楼2006-12-01 10:20 | 木野狐[匿名]
很好的总结,学习了。
  回复  引用  查看    
#10楼[楼主]2006-12-01 10:43 | TerryLee      
@木野狐[匿名]
:)

  回复  引用    
#11楼2006-12-01 12:50 | 谈少民[未注册用户]
我觉得.NET 下一点都不缺IOC的框架,只是缺少开源的,我自己都写过IOC容器。
另外,我很郁闷,为什么他们不能将Attribute和XML很好的结合起来呢?这个设计起来很难吗?我自己的设计就非常简单啊。

  回复  引用  查看    
#12楼2006-12-01 13:08 | 小C      
询问一个很小白的问题,框架好像载入dll的时候,都是从应用程序的运行根目录载入的,不知道可不可以从指定目录载入dll.
希望给个提示谢谢,如何写配置文件谢谢

  回复  引用  查看    
#13楼[楼主]2006-12-01 13:24 | TerryLee      
@谈少民
希望看到你的介绍:)

  回复  引用  查看    
#14楼[楼主]2006-12-01 13:29 | TerryLee      
@小C
不太明白你的意思,这些框架在用的时候直接添加引用就可以使用了

  回复  引用  查看    
#15楼2006-12-01 13:57 | 代码乱了      
  回复  引用  查看    
#16楼[楼主]2006-12-01 14:09 | TerryLee      
@代码乱了
找翻译团队帮忙:)

  回复  引用  查看    
#17楼2006-12-01 14:21 | 小C      
可能我理解的有些错误,其实我想实现的功能就是主程序MainApp.exe,可以载入很多的插件,像eclipse那样,插件都放在plugins目录下,mainApp.exe 每次启动会扫描plugins下的dll,并载入。然后我在MainApp.exe可以通过配置文件决定初始化那些对象,或者配置菜单然后show出哪些插件,但在MainApp项目中并没有引用这些对象。这个用.net的反射可以做,不过我相信spring.net或castle应该可以完成这些工作。不过我没有找到相应配置方法。请教方法。

希望我描述的还算清楚,谢谢

  回复  引用  查看    
#18楼[楼主]2006-12-01 14:33 | TerryLee      
@小C
这个不太清楚该怎么实现,开源项目的文档都很少,也不完整

  回复  引用    
#19楼2006-12-01 15:53 | jjx[未注册用户]
@小C
这个问题可大可小,因为插件的host需要考虑多种因素,像插件的类型,安全,插件的组织,插件与host的交互等。不过缩小一下,你可以做一下一些步骤

①构造一个插件接口,如IPlugin
②构造一个PluginDescriptor ,用于描述插件是什么样子的


public class PluginDescritpor{
public String PluginId;
}

这里的PluginId就是指向spring ioc中的object定义(id/name)

③构造插件的组织结构,一般就是一个插件树

public class PluginTreeNode{
public PluginDescriptor PluginDescriptor;
public IList<PluginTreeNode> Childrens;
}

④将插件树显示在ui中,比方说treeview,这个就不提了
当点击treeview中的一个节点时,获得PluginTreeNode.PluginDescriptor,从中得到PluginId
接下来的代码很简单
⑤执行插件

IApplicationContext context=ContextRegistry.GetContext();
IPlugin plugin=(IPlugin)context[PluginId];


  回复  引用  查看    
#20楼2006-12-01 16:54 | 小C      
感谢 jjx
前面正是按照你所说的方法实现的,目前的问题是,
IApplicationContext context=ContextRegistry.GetContext(); spring.net 总是从运行目录载入,而且如果改变的dll的名称也会出错。

执行这句话的时候,我并不能指定它从那去Load插件的dll,配置文件中似乎没有标识dll路径的说法。其实我想将插件都放在 plugins 目录下,便于管理。我想spring.net 应该有这功能,但始终未找到。

  回复  引用    
#21楼2006-12-01 17:15 | jjx[未注册用户]
定位assembly显然不是spring.net要做的,你应该求助于配置文件,如
<runtime>
<assemblyBiding>
<probing privatePath=""

具体的就不写了

  回复  引用  查看    
#22楼2006-12-01 23:34 | 牧野      
小C想要的这个东东,.Net已有很好的实现了吧,参考下Sharpdevelop啦,一个开源的IDE,由C#编写,可以运行在.Net和Mono下,基于类似于Java的Eclipse的Addins系统。思想也和Jjx说的大概相同,在SharpDevelop中的插件是有Path的。

SharpDevelop Uri: http://www.icsharpcode.net/OpenSource/SD/Default.aspx">http://www.icsharpcode.net/OpenSource/SD/Default.aspx

  回复  引用  查看    
#23楼2006-12-04 11:18 | 小C      
谢谢,jjx 和 牧野 的指点^_^
  回复  引用    
#24楼2007-11-07 18:38 | bn[未注册用户]
--引用--------------------------------------------------
ddee: .net的ioc容器选择真少,主流产品中两、三年过去了,就多了一个ObjectBuilder进入大家的视线,唉~~~~~~~~~

顺便推广一下caslte是不错的东东,terrylee的castle系列文章也很不错,给我们带来了很多帮助^_^
--------------------------------------------------------




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 578509





相关文章:

相关链接: