使用Unity2.0 配置文件和特性的配合快速完成方法的注入
时间:2011-02-22 来源:luckbird
我其实就是想实现通过在方法前面加一个特性来实现方法的接管,统一处理缓存的功能。
因为必须用Unity,并且要在配置文件中配置各个类的信息。但在网上没有找到类似的例子,所以研究了好久,其实方法很简单。现将研究结果放在这里,备忘一下。
配置文件:
1 <?xml version="1.0" encoding="utf-8" ?>2 <configuration>
3
4 <configSections>
5 <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" />
6 </configSections>
7
8 <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
9
10 <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration" />
11
12 <assembly name="Test" />
13 <namespace name="Test" />
14
15 <alias alias="Validation" type="Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.Unity.ValidationBlockExtension,Microsoft.Practices.EnterpriseLibrary.Validation"/>
16
17 <container>
18
19 <extension type="Interception" />
20 <extension type="Validation" />
21
22 <register type="ClassA">
23 <interceptor type="TransparentProxyInterceptor" />
24 <policyInjection />
25 </register>
26
27 </container>
28
29 </unity>
30
31 </configuration>
第10,23,24行是重点,必须有这些配置,在用UnityContainer的Reslove方法创建类时,类中加了特性的方法才会被接管。
在ClassA中需要缓存的方法前用这样的特性标注一下,即可实现方法结果缓存,需要自己写CachingCallHandlerAttribute类,我是从网上这里抄的
{
return DateTime.Now;
}
第15,20行是为了支持Validation验证需要的配置,加了这个配置才可以像下面使用验证功能。因为这是一个测试项目,这里的验证目前只会导致抛出异常,实际应用时应该再加上异常的处理或日志记录等。这些都可以通过方法接管来统一处理。
[ValidationCallHandler]public int Deposit([RangeValidator(typeof(Decimal), "0.0", RangeBoundaryType.Exclusive, "0.0", RangeBoundaryType.Ignore, MessageTemplate = "存款金额必须大于零")]decimal depositAmount)
{
return 0;
}
当然项目还要添加Enterprise Library相关的DLL,如果使用Enterprise Library的缓存管理模块,还要在app.config配置文件中加入缓存的配置信息。
相关阅读 更多 +