今天看到 李会军 先生的CastleIOC注入.. 关于自动装配的问题, A类中依赖IB接口 会自动的注入第一个
已经加入的组件.. 而且在 李会军 先生的文章下并没有配置XML, 以编码的形式装配. 故自己写一份.
使用的Castle是新版本..
上代码:
(以李会军先生的例子略做修改. ILog 接口新增一个ILogFormatter 的属性 只写)
显示行号 复制代码 ?
-
public interface ILog
-
{
-
void Write(string MsgStr);
-
ILogFormatter Formatter { set; }
-
}
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();}
结果:
Castle IOC新版本支持泛型约束, 我们可以进一步进行使用泛型来获取依赖组件..