關於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("../../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/[中文]
TerryLee的Castle系列:
http://terrylee.cnblogs.com/archive/2006/04/28/castl_ioc_article.Html[中文]
Ayende一篇非常棒的文章:http://msdn2.microsoft.com/en-us/library/aa973811.ASPx[英文]
二.Spring.NetSpring.NET是 從Java的Spring 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
Zhuzl的Spring.NET系列:http://blog.csdn.Net/zlz_212/category/241716.ASPx
三.ObjectBuilderObjectBuilder, 只看其名字就知道是用來構造對象的,是由微軟模式與實踐小組最早開發並使用在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/
學習資源:Niwalker的ObjectBuilder技術內幕:http://blog.csdn.Net/niwalker/category/18174.ASPx[中文]
浪子學編程系列:http://www.cnblogs.com/walkingboy/category/54596.Html[中文]
Idior的EnterLib ObjectBuild vs Castle WindsorContainer:http://www.cnblogs.com/idior/archive/2006/08/15/ObjectBuildvsCastle.Html[中文]
四.StructureMap前 面介紹的三個大家可能都比較熟悉了,這最後一個估計關注的人就比較少了。StructureMap也是.NET環境下的一個輕量級依賴注入工具, StructureMap是一個靈活的、可擴展的通用“插件”機制的.NET IOC框架,支持.NET1.1和2.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。