当前位置: 首页 > news >正文

幸福框架:可扩展的应用程序 “启动引导” 框架

背景

应用程序引导经常要做如下这些事情:

    • 动态加载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这里下载最新的源代码。

 

相关文章:

  • Java多线程设计模式(5)Future模式
  • 【算法】海量数据处理:有一千万条短信,有重复,以文本形式保存,一行一条,找出重复最少的前10条...
  • hdu 3631(floyd思想的运用)
  • 用MDT 2012为企业部署windows 7(七)--创建标准操作系统部署任务序列
  • 自动化运维之 Kerberos 账号信息管理平台
  • POJ 1226 Substrings 解题报告
  • 集合元素并查集
  • PostgreSQL的总体架构
  • Web 应用程序项目 XXXX 已配置为使用 IIS。 无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站。...
  • 030、 Linux 查看CPU信息、机器型号等硬件信息
  • 用Shell脚本监控服务器并发邮件报警
  • HANA学习笔记1-搭建HANA学习环境
  • linux何检查一个目录是否为空目录
  • 网站安全那些事
  • Gartner:数据审计与保护的9个关键能力
  • 收藏网友的 源程序下载网
  • [NodeJS] 关于Buffer
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript DOM 10 - 滚动
  • JDK 6和JDK 7中的substring()方法
  • leetcode388. Longest Absolute File Path
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Mybatis初体验
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • python3 使用 asyncio 代替线程
  • Yii源码解读-服务定位器(Service Locator)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 汉诺塔算法
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 巧用 TypeScript (一)
  • 算法-插入排序
  • 我从编程教室毕业
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 正则表达式小结
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • No resource identifier found for attribute,RxJava之zip操作符
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​iOS实时查看App运行日志
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $.each()与$(selector).each()
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm高校实验室 毕业设计 800008
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (全注解开发)学习Spring-MVC的第三天