Castle IOC容器实践之TypedFactory Facility(二)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:在Castle IOC容器实践之TypedFactory Facility(一)里面大家都已经知道了如何去使用TypedFactory Facility,也已经体会到它的方便之处了,为了更好的使用它,本篇我们对TypedFactory Facility的原理做一些简单的分析。

 

主要内容

TypedFactory Facility 原理分析

……

 

TypedFactory Facility中,有一个 FactoryEntry 类,这个类与我们平时项目开发中的实体类有一些类似,它用来记录工厂的相关信息,包括工厂的ID,工厂的接口,创建方法和销毁方法。这个类实现如下:
None.gif public   class  FactoryEntry
ExpandedBlockStart.gif
{
InBlock.gif    
private String _id;
InBlock.gif
InBlock.gif    
private Type _factoryInterface;
InBlock.gif
InBlock.gif    
private String _creationMethod;
InBlock.gif
InBlock.gif    
private String _destructionMethod;
InBlock.gif
InBlock.gif    
public FactoryEntry(String id, Type factoryInterface, String creationMethod, String destructionMethod)
ExpandedSubBlockStart.gif    
{
InBlock.gif        
// dot.gifdot.gif省略了验证及异常处理
InBlock.gif

InBlock.gif        _id 
= id;
InBlock.gif
InBlock.gif        _factoryInterface 
= factoryInterface;
InBlock.gif
InBlock.gif        _creationMethod 
= creationMethod;
InBlock.gif
InBlock.gif        _destructionMethod 
= destructionMethod;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public String Id
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return _id; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public Type FactoryInterface
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return _factoryInterface; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public String CreationMethod
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return _creationMethod; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public String DestructionMethod
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return _destructionMethod; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
TypedFactoryFacility 同样是继承于AbstractFacility,关于Facility的继承关系我在前面的文章中已经说过了。TypedFactory Facility在初始化的时候首先会获取工厂的类型,通过SubSystem来得到:
None.gif protected   override   void  Init()
ExpandedBlockStart.gif
{
InBlock.gif    Kernel.AddComponent( 
"typed.fac.interceptor"typeof(FactoryInterceptor) );
InBlock.gif
InBlock.gif    ITypeConverter converter 
= (ITypeConverter)
InBlock.gif
InBlock.gif        Kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
InBlock.gif
InBlock.gif    AddFactories(FacilityConfig, converter);
ExpandedBlockEnd.gif}

None.gif
None.gif
protected   virtual   void  AddFactories(IConfiguration facilityConfig, ITypeConverter converter)
ExpandedBlockStart.gif
{
InBlock.gif    
if (facilityConfig != null)
ExpandedSubBlockStart.gif    
{
InBlock.gif        
foreach(IConfiguration config in facilityConfig.Children["factories"].Children)
ExpandedSubBlockStart.gif        
{
InBlock.gif            String id 
= config.Attributes["id"];
InBlock.gif            String creation 
= config.Attributes["creation"];
InBlock.gif            String destruction 
= config.Attributes["destruction"];
InBlock.gif
InBlock.gif            Type factoryType 
= (Type)
InBlock.gif                converter.PerformConversion( config.Attributes[
"interface"], typeof(Type) );
InBlock.gif
InBlock.gif            
try
ExpandedSubBlockStart.gif            
{
InBlock.gif                AddTypedFactoryEntry( 
InBlock.gif
InBlock.gif                    
new FactoryEntry(id, factoryType, creation, destruction) );
ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch(Exception ex)
ExpandedSubBlockStart.gif            
{
InBlock.gif                
throw new ConfigurationException("Invalid factory entry in configuration", ex);
InBlock.gif
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
然后再创建一个 FactoryEntry实例,记录了工厂的信息,放在了 ComponentModel的扩展属性 ExtendedProperties中,设置 ComponentModel的生命周期为 Singleton
None.gif public   void  AddTypedFactoryEntry( FactoryEntry entry )
ExpandedBlockStart.gif
{
InBlock.gif    ComponentModel model 
= 
InBlock.gif
InBlock.gif        
new ComponentModel(entry.Id, entry.FactoryInterface, typeof(Empty));
InBlock.gif
InBlock.gif    model.LifestyleType 
= LifestyleType.Singleton;
InBlock.gif
InBlock.gif    model.ExtendedProperties[
"typed.fac.entry"= entry;
InBlock.gif
InBlock.gif    model.Interceptors.Add( 
new InterceptorReference( typeof(FactoryInterceptor) ) );
InBlock.gif
InBlock.gif    Kernel.AddCustomComponent( model );
InBlock.gif
ExpandedBlockEnd.gif}
在容器中加入一个工厂接口的拦截器 FactoryInterceptor ,当从容器中获取工厂时,会被拦截器拦截,拦截器的实现如下:
None.gif [Transient]
None.gif
None.gif
public   class  FactoryInterceptor : IMethodInterceptor, IOnBehalfAware
ExpandedBlockStart.gif
{
InBlock.gif    
private FactoryEntry _entry;
InBlock.gif
InBlock.gif    
private IKernel _kernel;
InBlock.gif
InBlock.gif    
public FactoryInterceptor(IKernel kernel)
ExpandedSubBlockStart.gif    
{
InBlock.gif        _kernel 
= kernel;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public void SetInterceptedComponentModel(ComponentModel target)
ExpandedSubBlockStart.gif    
{
InBlock.gif        _entry 
= (FactoryEntry) target.ExtendedProperties["typed.fac.entry"];
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public object Intercept(IMethodInvocation invocation, params object[] args)
ExpandedSubBlockStart.gif    
{
InBlock.gif        String name 
= invocation.Method.Name;
InBlock.gif
InBlock.gif        
if (name.Equals(_entry.CreationMethod))
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if (args.Length == 0 || args[0== null)
ExpandedSubBlockStart.gif            
{
InBlock.gif                
return _kernel[ invocation.Method.ReturnType ];
InBlock.gif
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gif            
{
InBlock.gif                
return _kernel[ (String) args[0] ];
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
else if (name.Equals(_entry.DestructionMethod))
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if (args.Length == 1)
ExpandedSubBlockStart.gif            
{
InBlock.gif                _kernel.ReleaseComponent( args[
0] );
InBlock.gif                
return null;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }
        
InBlock.gif
InBlock.gif        
return invocation.Proceed(args);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
还有一点需要我们注意的是在上面实例化 ComponentModel的时候用到了一个 Empty类,这个类是一个空类,没有任何实现:
None.gif public   class  Empty
ExpandedBlockStart.gif

InBlock.gif
ExpandedBlockEnd.gif}
在实例化 ComponentModel时需要传入的几个参数是:
None.gif public  ComponentModel(String name, Type service, Type implementation)
ExpandedBlockStart.gif
{
InBlock.gif    
this.name = name;
InBlock.gif
InBlock.gif    
this.service = service;
InBlock.gif
InBlock.gif    
this.implementation = implementation;
InBlock.gif
InBlock.gif    
this.lifestyleType = LifestyleType.Undefined;
InBlock.gif
ExpandedBlockEnd.gif}
即这里用一个空的类型来代替实现了的类型。















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