我心(xin)中(zhong)的(de)(de)核心(xin)組件(jian)(可插拔(ba)的(de)(de)AOP)~第十(shi)三回 實(shi)現AOP的(de)(de)攔(lan)截組件(jian)Unity.Interception
說在前
本節主要說一下Unity家族里的攔截組件,對于方法攔截有很多組件提供,基本上每個Ioc組件都有對它的實現,如autofac,它主要用在orchard項目里,而castle也有以攔截的體現,相關可以看我的Castle~實現IoC容器這篇文章,而今天主要說一個Unity里的方法攔截的實現,事實上本篇文章是對第二回 緩存攔截器的一個擴展(zhan)和補充,對于unity這東西在微軟的Nlayer項(xiang)目里(li)有所(suo)體現,它(ta)是基于DDD構(gou)架(jia)的,無論(lun)在架(jia)構(gou)選型還(huan)是技(ji)術選型上都很超前,也都結(jie)合了很大微軟高手的心血,可讀性很高,呵呵.
做在后
通過IoC建立對象實(shi)例的方(fang)法(fa)時,它們的配置(zhi)信息(xi)一般有兩種(zhong)方(fang)式存儲,第(di)一可(ke)以(yi)通過C#程序(xu)進(jin)行存儲并建立,第(di)二可(ke)以(yi)通過配置(zhi)文件先進(jin)行配置(zhi),然后(hou)在程序(xu)里直接(jie)調(diao)用即可(ke),今天這(zhe)篇文章,我(wo)們將對這(zhe)兩種(zhong)方(fang)法(fa)進(jin)行說明.
第一,通過配置文件建立實例
<!--BEGIN: Unity--> <unity xmlns="//schemas.microsoft.com/practices/2010/unity"> <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" /> <container> <extension type="Interception" /> <register type="Project.Caching.ICacheProvider, MvcApplication2" mapTo="Project.Caching.EntLibCacheProvider, MvcApplication2" /> <!--緩存的攔截--> <register type="接(jie)口類型,程序集" mapTo="接口(kou)實現(xian),程序集"> <!--<interceptor type="InterfaceInterceptor" />--> <interceptor type="InterfaceInterceptor" /> <interceptionBehavior type="Project.InterceptionBehaviors.CachingBehavior, MvcApplication2" /> </register> </container> </unity> <!--END: Unity--> <cachingConfiguration defaultCacheManager="ByteartRetailCacheManager"> <cacheManagers> <add name="ByteartRetailCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" expirationPollFrequencyInSeconds="600" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="NullBackingStore" /> <!-- expirationPollFrequencyInSeconds:過期(qi)時間(jian)(seconds) maximumElementsInCacheBeforeScavenging:緩沖中的最大元素數量 numberToRemoveWhenScavenging:一次移除的數量 --> </cacheManagers> <backingStores> <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="NullBackingStore" /> </backingStores> </cachingConfiguration>
程序(xu)里直接(jie)通過IOrderRepository來觸發它(ta)自己(ji)的方(fang)法攔截
Repository.IOrderRepository iOrderRepository = ServiceLocator.Instance.GetService<IOrderRepository>();
第二,通過程序直接建立實例
如果(guo)希(xi)望在程序里控(kong)(kong)制它(ta),代(dai)碼(ma)就多(duo)了一些(xie),控(kong)(kong)制上比較(jiao)靈活,配置文件是全局性的,而代(dai)碼(ma)里,可以有需要的時候(hou)進(jin)行(xing)創建
config配置中不需要對unity初始化,直接(jie)對caching節點進行聲明即(ji)可
<cachingConfiguration defaultCacheManager="ByteartRetailCacheManager"> <cacheManagers> <add name="ByteartRetailCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" expirationPollFrequencyInSeconds="600" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="NullBackingStore" /> <!-- expirationPollFrequencyInSeconds:過期(qi)時(shi)間(seconds) maximumElementsInCacheBeforeScavenging:緩沖中的(de)最大(da)元(yuan)素數量 numberToRemoveWhenScavenging:一次移(yi)除的(de)數量 --> </cacheManagers> <backingStores> <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="NullBackingStore" /> </backingStores> </cachingConfiguration>
C#程序部分
//創(chuang)建容(rong)器 IUnityContainer container = new UnityContainer(); //注冊映射 container.RegisterType<IOrderRepository, OrderRepository>(); //添加unity擴展(zhan),擴展(zhan)類型是一(yi)個(ge)攔(lan)截器(qi) container.AddNewExtension<Interception>(); //為(wei)接(jie)口IOrderRepository注(zhu)冊攔截器,它(ta)的方式是接(jie)口攔截器,攔截器的實現是一個行為(wei),它(ta)的實現體(ti)是Project.InterceptionBehaviors.CachingBehavior container.RegisterType<IOrderRepository, OrderRepository>( new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<Project.InterceptionBehaviors.CachingBehavior>());
OK,我們看了兩(liang)種攔截器的(de)實(shi)現(xian),選用哪種方(fang)式完全是看你的(de)具體場合了,呵(he)呵(he).
對緩存組件的封裝請下載