叶子的家

~●    ~●  ~●          ~●   ~●~●                           ○
    离成功还很远,距离长着叻,Fighting!
随笔 - 44, 文章 - 1, 评论 - 697, 阅读 - 22万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Castle实践6-TypedFactory Facility

Posted on   绿叶  阅读(4447)  评论(7编辑  收藏  举报

        如何在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~
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示