Enterprise Library深入解析與靈活應用(1):通過Unity Extension實現和Policy Injection Application Block的集成
1: namespace Artech.PolicyInjectionIntegratedInUnity
2: {
3: public class PolicyInjectionStrategy : EnterpriseLibraryBuilderStrategy
4: {
5: public override void PreBuildUp(IBuilderContext context)
6: {
7: base.PreBuildUp(context);
8: if (context.Policies.Get<IPolicyInjectionPolicy>(context.BuildKey) == null)
9: {
10: context.Policies.Set<IPolicyInjectionPolicy>(new PolicyInjectionPolicy(true), context.BuildKey);
11: }
12: }
13:
14: public override void PostBuildUp(IBuilderContext context)
15: {
16: base.PostBuildUp(context);
17: IPolicyInjectionPolicy policy = context.Policies.Get<IPolicyInjectionPolicy>(context.BuildKey);
18: if ((policy != null) && policy.ApplyPolicies)
19: {
20: policy.SetPolicyConfigurationSource(EnterpriseLibraryBuilderStrategy.GetConfigurationSource(context));
21: context.Existing = policy.ApplyProxy(context.Existing, BuildKey.GetType(context.OriginalBuildKey));
22: }
23: }
24: }
25: }
26:
27:
注:PolicyInjectionPolicy定了在Microsoft.Practices.EnterpriseLibrary.PolicyInjection dll中,實現了Microsoft.Practices.EnterpriseLibrary.PolicyInjection.ObjectBuilder.IPolicyInjectionPolicy和Microsoft.Practices.ObjectBuilder2.IBuilderPolicy。其ApplyProxy方法實際上就是調用了PolicyInjecctor的Wrap方法。
1: namespace Artech.PolicyInjectionIntegratedInUnity
2: {
3: public class PolicyInjectionExtension : UnityContainerExtension
4: {
5: protected override void Initialize()
6: {
7: base.Context.Strategies.AddNew<PolicyInjectionStrategy>(UnityBuildStage.Initialization);
8: }
9: }
10: }
11:
1: public interface ITimeService
2: {
3: DateTime GetSystemTime();
4: }
5:
6: [CachingCallHandler]
7: public class TimeService : ITimeService
8: {
9: #region IContract Members
10:
11: public DateTime GetSystemTime()
12: {
13: return DateTime.Now;
14: }
15:
16: #endregion
17: }
18: }
19:
1: namespace Artech.PolicyInjectionIntegratedInUnity
2: {
3: class Program
4: {
5: static void Main(string[] args)
6: {
7: IUnityContainer container = new UnityContainer();
8: container.AddExtension(new PolicyInjectionExtension());
9: container.RegisterType<ITimeService, TimeService>();
10: ITimeService instance = container.Resolve<ITimeService>();
11: for (int i = 0; i < 10; i++)
12: {
13: Console.WriteLine(instance.GetSystemTime());
14: Thread.Sleep(1000);
15: }
16: }
17: }
18: }
19:
1: <?xml version="1.0" encoding="utf-8"?>
2: <configuration>
3: <configSections>
4: <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
5: </configSections>
6: <unity>
7: <containers>
8: <container>
9: <types>
10: <type type="Artech.PolicyInjectionIntegratedInUnity.ITimeService,Artech.PolicyInjectionIntegratedInUnity" mapTo="Artech.PolicyInjectionIntegratedInUnity.TimeService,Artech.PolicyInjectionIntegratedInUnity"/>
11: </types>
12: <extensions>
13: <add type="Artech.PolicyInjectionIntegratedInUnity.PolicyInjectionExtension,Artech.PolicyInjectionIntegratedInUnity" />
14: </extensions>
15: </container>
16: </containers>
17: </unity>
18: </configuration>
19:
1: namespace Artech.PolicyInjectionIntegratedInUnity
2: {
3: class Program
4: {
5: static void Main(string[] args)
6: {
7: IUnityContainer container = new UnityContainer();
8: UnityConfigurationSection unityConfigSection = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
9: unityConfigSection.Containers.Default.Configure(container);
10: ITimeService instance = container.Resolve<ITimeService>();
11: for (int i = 0; i < 10; i++)
12: {
13: Console.WriteLine(instance.GetSystemTime());
14: Thread.Sleep(1000);
15: }
16: }
17: }
18: }
19:
Enterprise Library深入解析與靈活應用:
[1] 通過Unity Extension實現和Policy Injection Application Block的集成
[2] 通過SqlDependency實現Cache和Database的同步
[3] 倘若將Unity、PIAB、Exception Handling引入MVP模式
[4] 創建一個自定義Exception Handler改變ELAB的異常處理機製
[5] 創建一個簡易版的批處理執行器,認識Enterprise Library典型的配置方式和對象創建方式
[6] 自己動手創建迷你版AOP框架
[7] 再談PIAB與Unity之間的集成
作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-30 17:04:30