Castle IOC容器实践之FactorySupport Facility

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:FactorySupport Facility允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:
1 .使用访问器来访问组件的实例
2 .使用静态方法或者实例方式来访问组件的实例
 
主要内容
1 .概述
2 .为什么需要FactorySupport Facility
3 .如何使用
4 .常见的配置示例
5 .实现原理浅析
 
一.概述
FactorySupport Facility 允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:
1 .通过访问器来访问组件的实例
2 .通过静态方法或者实例方式来访问组件的实例
二.为什么需要FactorySupport Facility
为了回答这个问题,我们先来看一个简单的使用工厂的例子,如下代码所示:
public   interface  IComponent 

{
    
void Display();
}


public   class  MyComponent : IComponent

{
    
public MyComponent()

    
{   

    }


    
public void Display()

    
{
        Console.WriteLine(
"MyComponent");
    }

}


public   class  MyFactory

{
    
public MyFactory()

    
{

    }


    
public IComponent Create()

    
{
        
return new MyComponent();
    }

}
现在要在程序中使用 MyComponent的实例,简单一点会这样去写:
public   class  App

{
    
static void Main()

    
{
        MyFactory factory 
= new MyFactory();

        IComponent comp 
= factory.Create();

        comp.Display();

    }

}
正如你所看到的,在程序中使用 new关键字创建了一个工厂的实例,再由工厂得到组件的实例。现在我们看使用 FactorySupport Facility后带来了什么好处。工厂和组件的代码不变,仍然是:
public   interface  IComponent 

{
    
void Display();
}



public   class  MyComponent : IComponent

{
    
public MyComponent()

    
{

    }


    
public void Display()

    
{
        Console.WriteLine(
"MyComponent");
    }

}


public   class  MyFactory

{
    
public MyFactory()

    
{

    }


    
public IComponent Create()

    
{
        
return new MyComponent();
    }

}
配置文件,现在你可以不用理解怎么去配置,后面会讲到。
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< facilities >

        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />

    
</ facilities >

    
< components >

        
< component  id ="myfactory"  type ="FactorySupportDemo.MyFactory,FactorySupportDemo"   />

        
< component  id ="mycomp"  type ="FactorySupportDemo.MyComponent,FactorySupportDemo"

            factoryId
="myfactory"  factoryCreate ="Create" ></ component >

    
</ components >

</ configuration >
使用组件的实例
public   class  App

{
    
static void Main()

    
{
        IWindsorContainer container 
= new WindsorContainer("../../Basic.xml");


        IComponent instance 
= (IComponent) container["mycomp"];

        instance.Display();

    }

}
看到了吗?我们并没有使用 new关键字创建任何对象,只是把工厂、组件等通过配置文件抛给了 IOC容器,再从容器中往外取的时候,就可以直接取到组件的实例,这些实例是由工厂自动创建的,这正是 FactorySupport Facility的作用。
三.如何使用
知道了为什么需要FactorySupport Facility之后,下面就来看如何使用Facility。在前面的代码中大家都已经看到了,使用FactorySupport Facility是非常的简单。
1 .加入FactorySupport Facility到容器中,可以使用代码加入也可以使用配置文件。
使用代码加入:
IWindsorContainer container  =   new  WindsorContainer( " ../../Basic.xml " );


container.AddFacility(
" factorysupport " , new  Castle.Facilities.FactorySupport.FactorySupportFacility());
使用配置文件:
< facilities >

    
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />

</ facilities >
2 .加入组件时指定使用的是哪种方式
如果使用访问器只需要指定访问器的名称就可以了:
< component  id ="accessor.comp"  

    type
="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"

    instance-accessor
="Instance" >

</ component >
如果使用工厂方法,需要指定工厂 ID和工厂方法:
< component  id ="mycomp"  

            type
="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"

            factoryId
="mycompfactory"  factoryCreate ="Create" >

</ component >
四.常见的配置示例
这是一些常见的配置示例,来自于Castle自带的测试代码中。
1 .访问器配置示例
有这样一个单件类
public   class  SingletonWithAccessor

{
    
private static readonly SingletonWithAccessor instance = new SingletonWithAccessor();

    
private SingletonWithAccessor()

    
{

    }


    
public static SingletonWithAccessor Instance

    
{
        
get return instance; }
    }

}
配置文件如下:
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< facilities >

        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />

    
</ facilities >

    
< components >

        
< component  id ="accessor.comp"  type ="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"

            instance-accessor
="Instance" ></ component >

    
</ components >

</ configuration >
2 .普通工厂配置示例
组件类和工厂类如下
public   class  MyComp

{
    
public MyComp()

    
{

    }

}


public   class  MyCompFactory

{
    
public MyComp Create()

    
{
        
return new MyComp();
    }

}
配置文件如下:
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< facilities >

        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />

    
</ facilities >

    
< components >

        
< component  id ="mycompfactory"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory, Castle.Facilities.FactorySupport.Tests"   />

        
< component  id ="mycomp"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"

            factoryId
="mycompfactory"  factoryCreate ="Create" ></ component >

    
</ components >

</ configuration >
3 .带参工厂配置示例
组件类和工厂类如下:
public   class  MyComp

{
    
private string storeName;

    
private IDictionary props;

    
internal MyComp()
    
{

    }


    
internal MyComp(String storeName, IDictionary props)

    
{
        
this.storeName = storeName;

        
this.props = props;
    }


    
public string StoreName

    
{
        
get return storeName; }
    }


    
public IDictionary Props

    
{
        
get return props; }
    }

}


public   class  MyCompFactory2

{
    
public MyCompFactory2()

    
{

    }


    
public MyComp Create(String storeName, IDictionary props)

    
{
        
return new MyComp(storeName, props);
    }

}
配置文件如下:
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< facilities >

        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />

    
</ facilities >

    
< components >

       
< component  id ="mycompfactory"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory2, Castle.Facilities.FactorySupport.Tests" ></ component >

        
< component  id ="mycomp"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"

            factoryId
="mycompfactory"  factoryCreate ="Create" >

            
< parameters >

                
< storeName > MyStore </ storeName >

                
< props >

                    
< dictionary >

                        
< entry  key ="key1" > item1 </ entry >

                        
< entry  key ="key2" > item2 </ entry >

                    
</ dictionary >

                
</ props >

            
</ parameters >

        
</ component >

    
</ components >

</ configuration >
4 .使用自动装配工厂配置示例
组件类和工厂类如下:
public   interface  IMyService

{

}


public   class  MyComp

{
    
private IMyService serv;

    
internal MyComp()

    
{

    }


    
internal MyComp(IMyService serv)

    
{
        
this.serv = serv;
    }


    
public IMyService Service

    
{
        
get return serv; }
    }

}


public   class  MyCompFactory3

{
    
public MyCompFactory3()

    
{

    }


    
public MyComp Create(IMyService serv)

    
{
        
return new MyComp(serv);
    }

}
配置文件如下:
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< facilities >

        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />

    
</ facilities >

    
< components >

        
< component  id ="myserv"  service ="Castle.Facilities.FactorySupport.Tests.Components.IMyService, Castle.Facilities.FactorySupport.Tests"

            type
="Castle.Facilities.FactorySupport.Tests.Components.DefaultMyService, Castle.Facilities.FactorySupport.Tests"   />

       
< component  id ="mycompfactory"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory3, Castle.Facilities.FactorySupport.Tests" ></ component >

        
< component  id ="mycomp"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"

            factoryId
="mycompfactory"  factoryCreate ="Create" >

            
<!--  parameters is not necessary_u97 ?s it will auto wire  --> </ component >

    
</ components >

</ configuration >
五.实现原理浅析
FactorySupport Facility 的实现也是非常的简单,主要是通过两个 ComponentActivator 来实现,分别为AccessorActivatorFactoryActivator,根据配置文件的不同调用不同的Activator
String instanceAccessor  =  model.Configuration.Attributes[ " instance-accessor " ];

String factoryId 
=  model.Configuration.Attributes[ " factoryId " ];

String factoryCreate 
=  model.Configuration.Attributes[ " factoryCreate " ];


if  (instanceAccessor  !=   null )

{

    model.ExtendedProperties.Add( 
"instance.accessor", instanceAccessor );

    model.CustomComponentActivator 
= typeof(AccessorActivator);

}


else   if  (factoryId  !=   null )

{

    model.ExtendedProperties.Add( 
"factoryId", factoryId );

    model.ExtendedProperties.Add( 
"factoryCreate", factoryCreate );

    model.CustomComponentActivator 
= typeof(FactoryActivator);

}
好了,关于 FactorySupport Facility就介绍到这儿,更多 Castle的文章您可以访问《 Castle 开发系列文章》。
 













本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67692  ,如需转载请自行联系原作者
相关文章
|
5月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
237 2
|
1月前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
97 16
|
2月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
2月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
4月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
4月前
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
4月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
4月前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
本文源自张凯在2024云栖大会的演讲,介绍了阿里云容器服务在AI智算领域的创新与实践。从2018年推出首个开源GPU容器共享调度方案至今,阿里云容器服务不断推进云原生AI的发展,包括增强GPU可观测性、实现多集群跨地域统一调度、优化大模型推理引擎部署、提供灵活的弹性伸缩策略等,旨在为客户提供高效、低成本的云原生AI解决方案。
|
5月前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
179 2
|
5月前
|
Prometheus 监控 持续交付
深入理解Docker容器化技术:从基础到实践
深入理解Docker容器化技术:从基础到实践
下一篇
oss创建bucket