博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Castle IOC学习

Posted on 2010-10-08 13:30  SkyPurple  阅读(1135)  评论(2编辑  收藏  举报

今天看到 李会军 先生的CastleIOC注入.. 关于自动装配的问题, A类中依赖IB接口 会自动的注入第一个

已经加入的组件.. 而且在 李会军 先生的文章下并没有配置XML, 以编码的形式装配. 故自己写一份.

使用的Castle是新版本..

上代码:

(以李会军先生的例子略做修改. ILog 接口新增一个ILogFormatter 的属性 只写)

显示行号 复制代码
  1. public interface ILog
         
  2. {
         
  3.  void Write(string MsgStr);
         
  4.  ILogFormatter Formatter { set; }
         
  5. }
         

FileLog 实现该类

public class FileLog : ILog
 {
 private string _target;
 private ILogFormatter _formatter;
 
 public ILogFormatter Formatter
 {
 set { _formatter = value; }
 }
 
 public string Target
 {
 get { return _target; }
 set { _target = value; }
 }
 
 public FileLog(string target, ILogFormatter formatter)
 {
 this._target = target;
 this._formatter = formatter;
 }
 
 
 #region ILog 成员
 
 public void Write(string MsgStr)
 {
 string Str = this._formatter.Format(MsgStr);
 
 Console.WriteLine("Output " + Str + " in " + _target);
 }
 
 #endregion
 }

ILogFormatter 接口 我使用了TextFileFormatter 和 DataFileFormatter实现 方便为客户端调用时 可以切换依赖组件

public interface ILogFormatter
 {
 string Format(string MsgStr);
 }

TextFileFormatter 实现

public class TextFileFormatter : ILogFormatter
 {
 public TextFileFormatter() { }
 
 #region ILogFormartter 成员
 
 public string Format(string MsgStr)
 {
 return "[" + MsgStr + " TextFileFormatter" + "]";
 }
 
 #endregion
 }

DataFileFormatter 实现

public class DataFileFormatter : ILogFormatter
{
 #region ILogFormartter 成员
 
 public string Format(string MsgStr)
 {
 return "[" + MsgStr + " DataFileFormatter"+"]";
 }
 
 #endregion
}

上配置文件 app.config

<castle>
 <components>
 
 <component id="txtLog"
 service="CastleIOC.ILog, CastleIOC"
 type="CastleIOC.FileLog, CastleIOC">
 <parameters>
 <target>txt.log</target>
 </parameters>
 
 </component>
 
 <component id="textFormatter"
 service="CastleIOC.ILogFormatter, CastleIOC"
 type="CastleIOC.TextFileFormatter, CastleIOC">
 </component>
 <component id="dataFormatter"
 service="CastleIOC.ILogFormatter, CastleIOC"
 type="CastleIOC.DataFileFormatter, CastleIOC">
 </component>
 
 </components>
 </castle>

由配置文件可知, 我们在代码中取得ILog服务的时候 会自动帮我们装配 textFormatter 这个依赖组件.

Program.cs

static void Main(string[] args)
{
 IWindsorContainer container = new WindsorContainer(new XmlInterpreter());
 //首先获取ILog的自动装配服务
 ILog log = container.GetService<ILog>();
 //第一次自动装配依赖组件为首次装配的配置点 实现类为TextFileFormatter
 log.Write("This is Castle IOC");
 //更改依赖组件,手动更换(运行使更换在XML中切换2个Service的上下位置即可)
 log.Formatter = (ILogFormatter)container["dataFormatter"];
 
 log.Write("This is Castle IOC");
 
 Console.Read();
}

结果:

(C%$35[O1`U{@EA$F595[KM

 

 

 

 

 

Castle IOC新版本支持泛型约束, 我们可以进一步进行使用泛型来获取依赖组件..