可扩展的应用程序 “启动引导” 框架
可扩展的应用程序 “启动引导” 框架
背景
应用程序引导经常要做如下这些事情:
动态加载DLL(或各种插件)。 注册IOC容器。 设置其他全局配置。这其中尤其以注册IOC容器的代码最烦人,看一个我昨天写的烦人代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Threading; 7 8 using Microsoft.Practices.ServiceLocation; 9 using Microsoft.Practices.Unity; 10 11 using Happy.Event; 12 using Happy.Event.Offline; 13 14 namespace Happy.Event.Demo.Simple 15 { 16 class Program 17 { 18 static readonly string _QueueName = " Happy.Event.Demo.Simple " ; 19 20 static void Main( string [] args) 21 { 22 InitUnity(); 23 24 var writeQueue = OfflineEventQueueFactory.CreateMSMQOfflineEventQueue(_QueueName); 25 EventPublisher.Current.AddService(writeQueue); 26 27 EventPublisher.Current.Publish( new TestEvent()); 28 29 new Thread(() => 30 { 31 var readQueue = OfflineEventQueueFactory.CreateMSMQOfflineEventQueue(_QueueName); 32 var offlineEventProcessor = new OfflineEventProcessor(readQueue); 33 34 offlineEventProcessor.Start(); 35 }) 36 .Start(); 37 38 Console.ReadLine(); 39 } 40 41 static void InitUnity() 42 { 43 var container = new UnityContainer(); 44 45 ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container)); 46 47 container.RegisterType<ISyncEventSubscriber<TestEvent>, TestSyncEventSubscriber1>( " TestSyncEventSubscriber1 " ); 48 container.RegisterType<ISyncEventSubscriber<TestEvent>, TestSyncEventSubscriber2>( " TestSyncEventSubscriber2 " ); 49 container.RegisterType<IAsyncEventSubscriber<TestEvent>, TestAsyncEventSubscriber1>( " TestAsyncEventSubscriber1 " ); 50 container.RegisterType<IAsyncEventSubscriber<TestEvent>, TestAsyncEventSubscriber2>( " TestAsyncEventSubscriber2 " ); 51 container.RegisterType<IOfflineEventSubscriber<TestEvent>, TestOfflineEventSubscriber1>( " TestOfflineEventSubscriber1 " ); 52 container.RegisterType<IOfflineEventSubscriber<TestEvent>, TestOfflineEventSubscriber2>( " TestOfflineEventSubscriber2 " ); 53 } 54 } 55 }
是不是很糟糕,看着不爽。这也是我写这篇文章的目的。
新框架原理 约定胜于配置
用新框架重新昨天的配置代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Threading; 7 8 using Happy.Bootstrap; 9 using Happy.Event; 10 using Happy.Event.Offline; 11 12 namespace Happy.Event.Demo.Simple 13 { 14 class Program 15 { 16 static readonly string _QueueName = " Happy.Event.Demo.Simple " ; 17 18 static void Main( string [] args) 19 { 20 InitApp(); 21 22 InitOfflineEventProcessor(); 23 24 InitEventPublisher(); 25 26 EventPublisher.Current.Publish( new TestEvent()); 27 } 28 29 static void InitApp() 30 { 31 BootstrapService 32 .Current 33 .UseRegisterServiceByConventionPlug() 34 .UseEventSubscriberRegister() 35 .Done() 36 .Start(); 37 } 38 39 private static void InitEventPublisher() 40 { 41 var writeQueue = OfflineEventQueueFactory.CreateMSMQOfflineEventQueue(_QueueName); 42 EventPublisher.Current.AddService(writeQueue); 43 } 44 45 private static void InitOfflineEventProcessor() 46 { 47 new Thread(() => 48 { 49 var readQueue = OfflineEventQueueFactory.CreateMSMQOfflineEventQueue(_QueueName); 50 var offlineEventProcessor = new OfflineEventProcessor(readQueue); 51 52 offlineEventProcessor.Start(); 53 }) 54 .Start(); 55 } 56 } 57 }
这样是不是看着舒服多了。
备注
代码示例,可以直接去 http://happy.codeplex.com/SourceControl/latest 这里下载最新的源代码。
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于可扩展的应用程序 “启动引导” 框架的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did45648