zoukankan      html  css  js  c++  java
  • Castle IOC学习

    今天看到 李会军 先生的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新版本支持泛型约束, 我们可以进一步进行使用泛型来获取依赖组件..

  • 相关阅读:
    MSSQL2005和Access在SQL的某一种写法上的区别。update的一种写法不一致。
    博客园 记录 了解多一点
    马克斯4.0 采集规则的编写
    谷歌代码托管 GoogleCode中 关于 版本的一个写法
    晒晒名企大公司的工资收入
    Asp.net中DataBinder.Eval用法的总结
    Mastering Debugging in Visual Studio 2010 A Beginner's Guide
    Solution Configuration but not Platform in VS2010 Toolbar
    window.showdialog完全手册,解决模态窗口,传值和返回值问题
    从此不再惧怕URI编码:JavaScript及C# URI编码详解
  • 原文地址:https://www.cnblogs.com/Skypurple/p/1845757.html
Copyright © 2011-2022 走看看