• 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新版本支持泛型约束, 我们可以进一步进行使用泛型来获取依赖组件..

  • 相关阅读:
    CVE-2014-6271 Shellshock 破壳漏洞 复现
    0ctf-ezdoor-复现分析
    phpinfo中敏感信息记录
    未授权访问总结学习
    关于PHP内部类的一些总结学习
    PHP反序列化总结
    SSRF和XSS-filter_var(), preg_match() 和 parse_url()绕过学习
    Java14:你需要知道的新特性
    结构型设计模式
    项目总结
  • 原文地址:https://www.cnblogs.com/Skypurple/p/1845757.html
Copyright © 2020-2023  润新知