Castle IOC容器实践之EnterpriseLibrary Configuration Facility

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以 轻松 得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。
 
主要内容:
1 .概述
2 .使用Facility
3 .原理浅析
 
一.概述
EnterpriseLibrary Configuration Facility 就好像是在容器和数据类之间的桥,让我们可以 轻松 得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。先来看一下该Facility的相关信息:
Facility Information
Uses Proxy
No
Requires Configuration
Yes
Uses Attributes
No
Version
Beta 2
二.使用Facility
1 .配置文件,这里使用配置文件注册组件的方式,放在应用程序配置文件中,这里唯一需要注意的是configurationkey,这个特性不能写错:
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< configSections >

        
< section  name ="enterpriselibrary.configurationSettings"  type ="System.Configuration.IgnoreSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"   />

        
< section  name ="castle"  type ="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"   />

    
</ configSections >

    
< enterpriselibrary .configurationSettings xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"

        defaultSection
=""  applicationName ="Application"  xmlns ="http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/configuration" >

        
< configurationSections >

            
< configurationSection  name ="EditorSettings"  encrypt ="false" >

                
< storageProvider  xsi:type ="XmlFileStorageProviderData"  name ="XML File Storage Provider"  path ="../../EditorSettings.config"   />

                
< dataTransformer  xsi:type ="XmlSerializerTransformerData"  name ="Xml Serializer Transformer" >

                    
< includeTypes  />

                
</ dataTransformer >

            
</ configurationSection >

        
</ configurationSections >

        
< keyAlgorithmStorageProvider  xsi:nil ="true"   />

    
</ enterpriselibrary.configurationSettings >

    
< castle >

        
< facilities >

            
< facility  id ="configuration"  type ="Castle.Facilities.EnterpriseLibrary.Configuration.EnterpriseConfigurationFacility, Castle.Facilities.EnterpriseLibrary.Configuration"   />

        
</ facilities >

        
< components >

            
< component  id ="editorfontdata"  type ="ConfigurationQuickStart.EditorFontData, Castle.Facilities.EnterpriseLibrary.Configuration.Tests"

                configurationkey
="EditorSettings"   />

            
< component  id ="editorservice"  type ="Castle.Facilities.EnterpriseLibrary.Configuration.Tests.EditorService, Castle.Facilities.EnterpriseLibrary.Configuration.Tests"   />

        
</ components >

    
</ castle >

</ configuration >
2 .编写数据类文件:
public   class  EditorFontData
{       
    
private string  name;

    
private float   size;

    
private int     style;

    
public EditorFontData()
    
{          

    }


    
public string Name 
    
{
        
getreturn name; }

        
set{ name = value; }
    }
 

    
public float Size 
    
{
        
getreturn size; }

        
set{ size = value; }
    }
 

    
public int Style 
    
{
        
getreturn style; }

        
set{ style = value; }
    }
 

    
public override string ToString() 
    
{
        StringBuilder sb 
= new StringBuilder();

        sb.AppendFormat(
"Name = {0}; Size = {1}; Style = {2}", name, size.ToString(), style.ToString());

        
return sb.ToString();
    }

}
3 .采用XML方式的存储
<? xml version="1.0" encoding="utf-8" ?>

< EditorSettings >

  
< xmlSerializerSection  type ="ConfigurationQuickStart.EditorFontData, Castle.Facilities.EnterpriseLibrary.Configuration.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >

    
< EditorFontData  xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >

      
< Name > Microsoft Sans Serif </ Name >

      
< Size > 9.25 </ Size >

      
< Style > 0 </ Style >

    
</ EditorFontData >

  
</ xmlSerializerSection >

</ EditorSettings >
4 .使用数据类的组件
public   class  EditorService
{
    
private readonly EditorFontData data;

    
public EditorService(EditorFontData data)
    
{
        
this.data = data;
    }


    
public EditorFontData Data
    
{
        
get return data; }
    }

}
5 .在容器中使用数据类
[TestFixture]
public   class  FacilityTestCase
{
    [Test]
    
public void LoadingConfig()
    
{
        IWindsorContainer container 
= new WindsorContainer( new XmlInterpreter(new AppDomainConfigSource()) );

        EditorService service 
= (EditorService) container[ typeof(EditorService) ];

        Assert.AreEqual(
"Microsoft Sans Serif", service.Data.Name);

        Assert.AreEqual(
9.25,service.Data.Size);

    }


}
可以看到,使用 EnterpriseLibrary Configuration Facility非常的简单。最后还要注意一点,使用这个 Facility需要安装 Enterprise Library,因为它依赖于:
Microsoft.Practices.EnterpriseLibrary.Common.dll

Microsoft.Practices.EnterpriseLibrary.Configuration.dll
三.原理分析
下面对这个Facility的原理做一下简单的分析。在初始化的时候,它注册了一个名为 EntLibConfigurationInspector 的分发器
public   class  EnterpriseConfigurationFacility : AbstractFacility
{
    
protected override void Init()
    
{
Kernel.ComponentModelBuilder.AddContributor( 
new EntLibConfigurationInspector() );

    }

}


internal   class  EntLibConfigurationInspector : IContributeComponentModelConstruction
{
    
public void ProcessModel(IKernel kernel, ComponentModel model)
    
{
        
if (model.Configuration == nullreturn;

        String configKey 
= model.Configuration.Attributes["configurationkey"];

        
if (configKey == nullreturn;

        model.ExtendedProperties[
"configurationkey"= configKey;

        model.CustomComponentActivator 
= typeof(EntLibComponentActivator);
    }

}
EntLibConfigurationInspector中为 ComponentModel注册一个 CustomComponentActivator类型的 Activator,这个 CustomComponentActivator的实现为 EntLibComponentActivator
internal   class  EntLibComponentActivator : AbstractComponentActivator
{
    
public EntLibComponentActivator(ComponentModel model, IKernel kernel, 

        ComponentInstanceDelegate onCreation, ComponentInstanceDelegate onDestruction) : 
base(model, kernel, onCreation, onDestruction)
    
{

    }


    
protected override object InternalCreate()
    
{
        String configKey 
= (String) Model.ExtendedProperties["configurationkey"];

        
return ConfigurationManager.GetConfiguration(configKey);

    }


    
protected override void InternalDestroy(object instance)
    
{
        String configKey 
= (String) Model.ExtendedProperties["configurationkey"];

        ConfigurationManager.WriteConfiguration(configKey, instance);

    }

}

好了,关于 EnterpriseLibrary Configuration Facility就简单的介绍到这里。
更多Castle文章可以访问:《Castle 开发系列文章

















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