zoukankan      html  css  js  c++  java
  • Castle实践6-TypedFactory Facility

            如何在Castle IOC中使用工厂呢?本节就是你所要的,你会觉得在Castle IOC中使用工厂是件多么容易的事情,并且是高灵活度,低耦合的。

    【使用篇】
    1)定义一个产品接口

    public interface IProduct
    {}


    2)实现一个或者多个产品类

    public class ConcreteProduct1 : IProduct
    {}

    public class ConcreteProduct2 : IProduct
    {}

    3) 定义一个工厂接口
    public interface IProductFactory
    {
        
    // 生产方法
        IProduct Create(String key);
        
    // 销毁方法
        void Release(IProduct handler);
    }

    4)定义一个配置文件
    <configuration>
        
    <facilities>
            
    <facility id="typedfactory">
                
    <factories>
                    
    <factory id="productFactory" interface="TypedFactoryDemo.IProductFactory, TypedFactoryDemo"
                        creation
    ="Create" destruction="Release" />
                
    </factories>
            
    </facility>
        
    </facilities>
    </configuration>

    5)初始化容器
    // 初始化一个容器
    IWindsorContainer container = new WindsorContainer("typedFactory_config.xml" );
    // 加入Facility
    container.AddFacility( "typedfactory"new TypedFactoryFacility() );
    // 加入产品
    container.AddComponent( "prod1"typeof(IProduct), typeof(ConcreteProduct1) );
    container.AddComponent( 
    "prod2"typeof(IProduct), typeof(ConcreteProduct2) );

    6)使用工厂
    // 从容器中获取工厂
    IProductFactory factory = (IProductFactory)container["productFacotry"];
    // 进行生产
    IProduct prod1 = factory.Create("prod1");  // prod1 is ConcreteProduct1
    IProduct prod2 
    = factory.Create("prod2");  // prod2 is ConcreteProduct2


            OK!你不需要写任何的具体的工厂方法,也不用new任何一个具体的产品。增加一个工厂或者是增加一个产品,是不是很简单呢?想知道其中的奥秘吧,那请你继续往下看。

    【原理篇】
            这个Facility中有一个叫FactoryEntry的类,专门是用来收集初始化的工厂信息的。包括工厂ID、工厂接口、工厂的创建产品方法和工厂的销毁产品方法。
            而在TypedFactoryFacility中,容器首先对配置的工厂初始化一个FactoryEntry工厂信息库放到工厂Model的ExtendedProperties中,然后容器会加入一个工厂接口的拦截器FactoryInterceptor,当从容器中获取一个工厂的时候,就会被拦截器拦截。
            在拦截器的处理里面会自动根据工厂的创建方法名称(FactoryEntry.CreationMethod)来向容器中索取一个产品对象。又或者是销毁方法名称(FactoryEntry.DestructionMethod)在容器中ReleaseComponent一个产品对象。

    除此之外,你还可以这样定义工厂接口:
    public interface IProductFactory
    {
        
    // 生产方法
        ConcreteProduct Create();
    }

    如果你想要自己的工厂生产方法,那也完全没问题,只要你实现自己的工厂方法而方法的名称和配置文件中的creation或者destruction指定的方法名称不同就可以了。

    【后记】
    此外,在看源码过程中,有两处是值得探讨的。由于前项目阶段性完成,今天要回深圳,所以我就贴出来让大家看下,一起研究研究。xixi :)
    // 是这样得到工厂类型的
    ITypeConverter converter = (ITypeConverter)_kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
    Type factoryType 
    = (Type)converter.PerformConversion( config.Attributes["interface"], typeof(Type) );



    // Empty 是个空类哦~
    ComponentModel model = new ComponentModel(entry.Id, entry.FactoryInterface, typeof(Empty));

    see you then~
  • 相关阅读:
    C#如何生成CHM帮助文件
    使用WebBrowser控件播放Flash网页相关问题解决方法
    C# AnimateWindow与WindowState同时使用的效果
    C#读取计算机串口
    C#基础概念二十五个问题
    C# ini 文件读取方法
    JSP读出MYSQL数据库时的乱码问题解决方案
    世界编程大赛头名程序
    比较著名的.net技术论坛网址(含国外的)
    How to Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOS 6
  • 原文地址:https://www.cnblogs.com/wj/p/191359.html
Copyright © 2011-2022 走看看