Castle IOC容器实践之FactorySupport Facility

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:FactorySupport Facility允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:

1 .使用访问器来访问组件的实例

2 .使用静态方法或者实例方式来访问组件的实例

 

主要内容

1 .概述

2 .为什么需要FactorySupport Facility

3 .如何使用

4 .常见的配置示例

5 .实现原理浅析

 

一.概述

FactorySupport Facility 允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:

1 .通过访问器来访问组件的实例

2 .通过静态方法或者实例方式来访问组件的实例

二.为什么需要FactorySupport Facility

为了回答这个问题,我们先来看一个简单的使用工厂的例子,如下代码所示:

None.gif public   interface  IComponent 
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
void Display();
ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyComponent : IComponent
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyComponent()
InBlock.gif
ExpandedSubBlockStart.gif    
{   
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public void Display()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        Console.WriteLine(
"MyComponentdot.gifdot.gif");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyFactory
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyFactory()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public IComponent Create()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return new MyComponent();
ExpandedSubBlockEnd.gif    }

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

None.gif public   class  App
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
static void Main()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        MyFactory factory 
= new MyFactory();
InBlock.gif
InBlock.gif        IComponent comp 
= factory.Create();
InBlock.gif
InBlock.gif        comp.Display();
InBlock.gif
ExpandedSubBlockEnd.gif    }

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

None.gif public   interface  IComponent 
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
void Display();
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
public   class  MyComponent : IComponent
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyComponent()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public void Display()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        Console.WriteLine(
"MyComponentdot.gifdot.gif");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyFactory
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyFactory()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public IComponent Create()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return new MyComponent();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
配置文件,现在你可以不用理解怎么去配置,后面会讲到。
None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />
None.gif
None.gif    
</ facilities >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="myfactory"  type ="FactorySupportDemo.MyFactory,FactorySupportDemo"   />
None.gif
None.gif        
< component  id ="mycomp"  type ="FactorySupportDemo.MyComponent,FactorySupportDemo"
None.gif
None.gif            factoryId
="myfactory"  factoryCreate ="Create" ></ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
使用组件的实例

None.gif public   class  App
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
static void Main()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        IWindsorContainer container 
= new WindsorContainer("../../Basic.xml");
InBlock.gif
InBlock.gif
InBlock.gif        IComponent instance 
= (IComponent) container["mycomp"];
InBlock.gif
InBlock.gif        instance.Display();
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
看到了吗?我们并没有使用 new关键字创建任何对象,只是把工厂、组件等通过配置文件抛给了 IOC容器,再从容器中往外取的时候,就可以直接取到组件的实例,这些实例是由工厂自动创建的,这正是 FactorySupport Facility的作用。

三.如何使用

知道了为什么需要FactorySupport Facility之后,下面就来看如何使用Facility。在前面的代码中大家都已经看到了,使用FactorySupport Facility是非常的简单。

1 .加入FactorySupport Facility到容器中,可以使用代码加入也可以使用配置文件。

使用代码加入:
None.gif IWindsorContainer container  =   new  WindsorContainer( " ../../Basic.xml " );
None.gif
None.gif
None.gifcontainer.AddFacility(
" factorysupport " , new  Castle.Facilities.FactorySupport.FactorySupportFacility());
使用配置文件:
None.gif < facilities >
None.gif
None.gif    
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />
None.gif
None.gif
</ facilities >
2 .加入组件时指定使用的是哪种方式

如果使用访问器只需要指定访问器的名称就可以了:
None.gif < component  id ="accessor.comp"  
None.gif
None.gif    type
="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif    instance-accessor
="Instance" >
None.gif
None.gif
</ component >
如果使用工厂方法,需要指定工厂 ID和工厂方法:
None.gif < component  id ="mycomp"  
None.gif
None.gif            type
="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif            factoryId
="mycompfactory"  factoryCreate ="Create" >
None.gif
None.gif
</ component >
四.常见的配置示例

这是一些常见的配置示例,来自于Castle自带的测试代码中。

1 .访问器配置示例

有这样一个单件类
None.gif public   class  SingletonWithAccessor
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
private static readonly SingletonWithAccessor instance = new SingletonWithAccessor();
InBlock.gif
InBlock.gif    
private SingletonWithAccessor()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static SingletonWithAccessor Instance
InBlock.gif
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return instance; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
配置文件如下:

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />
None.gif
None.gif    
</ facilities >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="accessor.comp"  type ="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif            instance-accessor
="Instance" ></ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
2 .普通工厂配置示例

组件类和工厂类如下

None.gif public   class  MyComp
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyComp()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyCompFactory
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyComp Create()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return new MyComp();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
配置文件如下:

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />
None.gif
None.gif    
</ facilities >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="mycompfactory"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory, Castle.Facilities.FactorySupport.Tests"   />
None.gif
None.gif        
< component  id ="mycomp"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif            factoryId
="mycompfactory"  factoryCreate ="Create" ></ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
3 .带参工厂配置示例

组件类和工厂类如下:

None.gif public   class  MyComp
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
private string storeName;
InBlock.gif
InBlock.gif    
private IDictionary props;
InBlock.gif
InBlock.gif    
internal MyComp()
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
internal MyComp(String storeName, IDictionary props)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
this.storeName = storeName;
InBlock.gif
InBlock.gif        
this.props = props;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public string StoreName
InBlock.gif
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return storeName; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public IDictionary Props
InBlock.gif
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return props; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyCompFactory2
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyCompFactory2()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public MyComp Create(String storeName, IDictionary props)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return new MyComp(storeName, props);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
配置文件如下:

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />
None.gif
None.gif    
</ facilities >
None.gif
None.gif    
< components >
None.gif
None.gif       
< component  id ="mycompfactory"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory2, Castle.Facilities.FactorySupport.Tests" ></ component >
None.gif
None.gif        
< component  id ="mycomp"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif            factoryId
="mycompfactory"  factoryCreate ="Create" >
None.gif
None.gif            
< parameters >
None.gif
None.gif                
< storeName > MyStore </ storeName >
None.gif
None.gif                
< props >
None.gif
None.gif                    
< dictionary >
None.gif
None.gif                        
< entry  key ="key1" > item1 </ entry >
None.gif
None.gif                        
< entry  key ="key2" > item2 </ entry >
None.gif
None.gif                    
</ dictionary >
None.gif
None.gif                
</ props >
None.gif
None.gif            
</ parameters >
None.gif
None.gif        
</ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
4 .使用自动装配工厂配置示例

组件类和工厂类如下:

None.gif public   interface  IMyService
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyComp
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
private IMyService serv;
InBlock.gif
InBlock.gif    
internal MyComp()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
internal MyComp(IMyService serv)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
this.serv = serv;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public IMyService Service
InBlock.gif
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return serv; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyCompFactory3
None.gif
ExpandedBlockStart.gif
{
InBlock.gif    
public MyCompFactory3()
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public MyComp Create(IMyService serv)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return new MyComp(serv);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
配置文件如下:

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< facilities >
None.gif
None.gif        
< facility  id ="factorysupport"  type ="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"   />
None.gif
None.gif    
</ facilities >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="myserv"  service ="Castle.Facilities.FactorySupport.Tests.Components.IMyService, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif            type
="Castle.Facilities.FactorySupport.Tests.Components.DefaultMyService, Castle.Facilities.FactorySupport.Tests"   />
None.gif
None.gif       
< component  id ="mycompfactory"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory3, Castle.Facilities.FactorySupport.Tests" ></ component >
None.gif
None.gif        
< component  id ="mycomp"  type ="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
None.gif
None.gif            factoryId
="mycompfactory"  factoryCreate ="Create" >
None.gif
None.gif            
<!--  parameters is not necessary_u97 ?s it will auto wire  --> </ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >
五.实现原理浅析

FactorySupport Facility 的实现也是非常的简单,主要是通过两个 ComponentActivator 来实现,分别为AccessorActivatorFactoryActivator,根据配置文件的不同调用不同的Activator

None.gif String instanceAccessor  =  model.Configuration.Attributes[ " instance-accessor " ];
None.gif
None.gifString factoryId 
=  model.Configuration.Attributes[ " factoryId " ];
None.gif
None.gifString factoryCreate 
=  model.Configuration.Attributes[ " factoryCreate " ];
None.gif
None.gif
None.gif
if  (instanceAccessor  !=   null )
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gif    model.ExtendedProperties.Add( 
"instance.accessor", instanceAccessor );
InBlock.gif
InBlock.gif    model.CustomComponentActivator 
= typeof(AccessorActivator);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
else   if  (factoryId  !=   null )
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gif    model.ExtendedProperties.Add( 
"factoryId", factoryId );
InBlock.gif
InBlock.gif    model.ExtendedProperties.Add( 
"factoryCreate", factoryCreate );
InBlock.gif
InBlock.gif    model.CustomComponentActivator 
= typeof(FactoryActivator);
InBlock.gif
ExpandedBlockEnd.gif}
好了,关于 FactorySupport Facility就介绍到这儿,更多 Castle的文章您可以访问《 Castle 开发系列文章》。

 














本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67692  ,如需转载请自行联系原作者
相关文章
|
27天前
|
运维 安全 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在数字化转型的浪潮中,企业对于IT基础设施的要求越来越高,不仅需要快速响应市场变化,还要确保系统的稳定与安全。本文深入探讨了如何通过融合DevOps文化和容器化技术来构建一个高效、稳定且易于管理的云基础设施。通过实际案例分析,阐述了持续集成/持续部署(CI/CD)流程的优化、自动化测试、监控以及日志管理等关键环节的实施策略,旨在为运维专业人员提供一套切实可行的解决方案。
23 3
|
1月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
30天前
|
运维 Kubernetes Devops
构建高效可靠的云基础设施:DevOps与容器化技术融合实践
【2月更文挑战第30天】 在当今快速迭代和竞争激烈的软件开发领域,传统的IT运维模式已难以满足业务发展的需要。本文将探讨如何通过整合DevOps文化和容器化技术,构建一个既高效又可靠的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作流的影响,接着深入讨论了容器化技术的优势和挑战,并提出了一套结合两者的实施方案。最后,通过案例分析展示了该方案在实际环境中的应用效果和潜在益处。
|
5天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
7天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第13天】 在当今快速迭代和持续部署的软件开发环境中,传统的IT运维模式已难以满足业务发展的需求。本文聚焦于如何通过融合DevOps理念与容器化技术,构建一个高效、稳定且易于管理的云基础设施。文章将探讨持续集成/持续交付(CI/CD)流程的优化、容器化技术的最佳实践、以及微服务架构下的应用管理,以期为企业提供一种改进运维效率、加速产品上市时间,同时保障系统稳定性的解决方案。
|
22天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
随着企业数字化转型的不断深入,传统的IT运维模式已经难以满足快速迭代和持续交付的需求。本文将探讨如何通过结合DevOps文化与容器化技术,构建一个既高效又稳定的云基础设施。文章首先概述了DevOps的核心理念及其在现代运维中的重要性,然后详细介绍了容器化技术,特别是Docker和Kubernetes在实现微服务架构中的应用。最后,文中通过案例分析展示了这一融合实践如何在真实环境中提升运维效率和系统稳定性。
20 7
|
25天前
|
运维 Kubernetes 监控
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在当今云计算时代,企业追求敏捷性、可扩展性以及成本效益的云基础设施。本文将探讨如何通过DevOps文化与容器化技术的融合,打造一个既高效又稳定的运维环境。文章不仅阐述了DevOps和容器化技术各自的优势,还提供了一个具体的实施案例,展示了这种结合如何优化资源利用、提高部署速度并降低运维复杂性。
|
28天前
|
运维 监控 Devops
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
在数字化转型的浪潮中,企业的IT基础设施和软件交付模式正经历着深刻的变革。传统的运维方式已难以满足快速迭代、灵活扩展的现代业务需求。本文将探讨如何通过容器技术实现高效的自动化运维体系,重点分析持续集成(CI)与持续部署(CD)的实践方法及其对企业运维效率的影响。通过引入微服务架构、容器编排、DevOps文化等概念,我们旨在为读者提供一套全面的自动化运维解决方案,以支持业务的敏捷性和可扩展性。
|
1月前
|
存储 前端开发 Java
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。