OSGI:C#如何实现简单的OSGI

OSGI:C#如何实现简单的OSGI

我对OSGI的认识

  • 面向接口编程在组件(DLL)级别的体现。
  • 插件机制的一种扩展。
  • 动态管理组件(DLL)的生命周期(加载、启动、停止、卸载)。
  • 回调和插件的支持,在Bundle的生命周期中,允许通过插件和回调进行拦截。
  • Ioc容器的集成(非必须),如:Bundle启动时自动将服务注册到Ioc中,停止时自动取消服务注册。
  • Ioc管理服务的生命周期,OSGI管理组件的生命周期。

代码示例(下载地址

  项目结构及他们的依赖关系

  Program.cs 中的代码

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 using Microsoft.Practices.ServiceLocation;
 8 
 9 using Happy.OSGI;
10 using Happy.Commands;
11 using Happy.Ioc.Unity;
12 using Happy.OSGI.Demo.Commands;
13 
14 namespace Happy.OSGI.Demo.Host
15 {
16     public static class Program
17     {
18         public static void Main()
19         {
20             Initialize();
21 
22             var commandBus = ServiceLocator.Current.GetInstance<CommandBus>();
23             var command = new TestCommand { Message = "测试消息" };
24 
25             Console.WriteLine("默认所有的Bundle都是启动的,执行情况如下:");
26             commandBus.Send(command);
27 
28             Console.WriteLine();
29 
30             Console.WriteLine("停止一个Bundle后,执行情况如下:");
31             BundleContainer.Current.Bundles.First().Stop();
32             commandBus.Send(command);
33 
34             Console.WriteLine();
35 
36             Console.WriteLine("重新启动Bundle后,执行情况如下:");
37             BundleContainer.Current.Bundles.First().Start();
38             commandBus.Send(command);
39         }
40 
41         private static void Initialize()
42         {
43             BundleContainer
44                 .Current
45                 .UseDirectoryAssemblyLoader()
46                 .UseUnity()
47                 .RegistCommandHandlerByConvention()
48                 .Start();
49         }
50     }
51 }
复制代码

  执行结果

 
 
分类: OSGI

03 2013 档案

 
摘要: 我对OSGI的认识面向接口编程在组件(DLL)级别的体现。插件机制的一种扩展。动态管理组件(DLL)的生命周期(加载、启动、停止、卸载)。回调和插件的支持,在Bundle的生命周期中,允许通过插件和回调进行拦截。Ioc容器的集成(非必须),如:Bundle启动时自动将服务注册到Ioc中,停止时自动取消服务注册。Ioc管理服务的生命周期,OSGI管理组件的生命周期。代码示例(下载地址) 项目结构及他们的依赖关系 Program.cs 中的代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 ..阅读全文
posted @ 2013-03-30 14:59 幸福框架 阅读(175) | 评论 (0) 编辑
 
摘要: 重构与模式(修订版)当当网¥42.50(77折)2013-01-30 00:09:155615274300发表评价代码阅读(权威精选植根于开发实践的最佳读...当当网¥61.10(77折)2012-12-30 10:59:105465865000发表评价代码质量(权威精选植根于开发实践的最佳读...当当网¥71.20(80折)2012-12-30 10:59:105465865000发表评价面向对象分析与设计(第3版)(权威精选植...当当网¥78.10(79折)2012-12-30 10:59:105465865000发表评价敏捷技能修炼:敏捷软件开发与设计的最佳实...当当网¥44.40(阅读全文
posted @ 2013-03-29 17:17 幸福框架 阅读(222) | 评论 (3) 编辑
 
摘要: 我相信优秀的语言能带给我们不同的思维能力和表达能力,我也相信对业务模型的正确理解才是软件成功与否的根本原因。 我对语言的关注多于对业务模型的关注,可以说是因为需求层次导致的,静下心来思考,才发现是因为是自己的懒惰,其实理解业务模型的难度要大于理解语言,想成为一名优秀的程序员,就要勇敢的面对挑战,不能再逃避难的事情。阅读全文
posted @ 2013-03-28 10:56 幸福框架 阅读(3) | 评论 (0) 编辑
 
摘要: 第一种1 public class ApplicationService2 {3 public void Create(string username, string password);4 5 //xxx其它方法 6 }第二种1 public class ApplicationService2 {3 public CreateUserResponse Create(CreateUserRequest request);4 5 //xxx其它方法 6 }第三种1 public class CreateUserCommand {}2...阅读全文
posted @ 2013-03-27 09:24 幸福框架 阅读(14) | 评论 (0) 编辑
 
摘要: 场景 修改用户名时,要验证用户名的唯一性。实现11 public class User2 {3 public void ChangeUsername(string newUsername)4 { 5 //使用服务定位器获取IUsernameUniqueService ,执行验证。6 }7 }实现2 1 public class User 2 { 3 public void ChangeUsername(string newUsername) 4 { 5 EventBus....阅读全文
posted @ 2013-03-26 09:28 幸福框架 阅读(20) | 评论 (0) 编辑
 
摘要: 我需要的是热情和梦想,不需要坚持,坚持有点勉强的意思。 对于梦想,我之前太过急功近利,希望能短时间实现梦想,这种想法让自己有些许的疲惫,最主要是会导致适得其反的效果,从此要怀着恬淡自然的想法去追逐梦想,不懈怠也不着急。 梦想:希望快乐的编程到100岁。阅读全文
posted @ 2013-03-25 17:51 幸福框架 阅读(8) | 评论 (0) 编辑
 
摘要: PPT对应某个聚合。Des对应某个聚合或其它聚合内的实体或值对象。MI对应某个聚合。Role对应PPT(Data)在某个上下文(Context)执行某些交互(Interactive)的代理或装饰器。四色原型中的一些静态方法需要移动到仓储或服务中。阅读全文
posted @ 2013-03-24 13:54 幸福框架 阅读(9) | 评论 (0) 编辑
 
摘要: CQRS架构的选择?系统的分层策略?应用层的组织风格?是否采用EventDriven?这些统统和咱们讨论的话题没关系,换句话说:“无论您采用贫血模型或领域模型,您都可以选择之上的技术”。 贫血模型和领域模型从OO的角度考虑,前者缺少“封装”,换句话说:“无论您采用贫血模型或领域模型,您都可以用好继承和多态”。 封装带来的最大好处就是依赖性的降低和可维护性的提高。阅读全文
posted @ 2013-03-23 16:07 幸福框架 阅读(19) | 评论 (0) 编辑
 
摘要: 《精通.NET企业项目开发:最新的模式、工具与方法》《.NET应用架构设计:原则、模式与实践》《ASP.NET设计模式》《Microsoft .NET企业级应用架构设计》《领域驱动设计C#2008实现》《领域驱动设计与模式实战》《领域驱动设计》阅读全文
posted @ 2013-03-22 13:27 幸福框架 阅读(48) | 评论 (1) 编辑
 
摘要: 程序中的读写分离,具体表现为:读写使用不同的设计理念、不同的执行流程、物理上分布在不同的DLL。程序中的读写分离+数据中的读写分离,具体表现为:除了上边的要求外,读写数据库也是独立的,同步可以用Event或其它机制。程序中的读写分离+数据中的读写分离+EventSource+InMemory:除了上边的要求外,引入了EventStore、SnapStore、InMemory DomainObject的概念。阅读全文
posted @ 2013-03-21 15:44 幸福框架 阅读(30) | 评论 (0) 编辑
 
摘要: 仓储接口在领域层。仓储实现在基础设层。仓储的主要职责是处理聚合的和持久化相关的任务(ADD、UPDATE、DELETE、GET)。仓储不应当实现业务逻辑,如:ADD操作的前置条件(用户名必须唯一)。 结论:如果是这样,应用层是不是最好不要直接用仓储,因为仓储没有封装业务逻辑,直接用可能会绕过业务逻辑。阅读全文
posted @ 2013-03-20 14:13 幸福框架 阅读(13) | 评论 (0) 编辑
 
摘要: TDD测试流程先写测试。后写代码。进行重构。TDD原则:一次只测试一个类。一次只测试一个功能。TDD优势:强迫你做出松散耦合的设计。强迫你站在用户的角度思考问题。作为负效果,你拥有了自动化测试。测试可以作为文档使用。阅读全文
posted @ 2013-03-19 09:10 幸福框架 阅读(15) | 评论 (1) 编辑
 
摘要: 第一步:配置外部工具第二步:使用工具 选中“生成器配置信息(Domain.json)”,然后点击【工具-》HappyGenerator】进行代码生成。阅读全文
posted @ 2013-03-18 08:48 幸福框架 阅读(45) | 评论 (1) 编辑
 
摘要: 作为开发人员,你无时无刻不在做出决定,思考你的每个决定,给自己一个充分的理由,常见的决策如下:架构的风格。技术的选择。编码的风格。API的命名。模式的选择。变量的命名。语句的组织方式。算法的选择。阅读全文
posted @ 2013-03-17 08:44 幸福框架 阅读(16) | 评论 (0) 编辑
 
摘要: MI和MIDetail属于同一个聚合。MI和MIdetail不能持有对PPT的引用,只能存储其快照。PPT多数情况是一个聚合就一个聚合根;Description对PPT的描述,可以表示为一个标识引用或将Description做为值对象。Description多数情况是一个聚合就一个聚合根。Role多数情况可以视作一个领域服务。四色原型间的关系通过仓储进行导航。阅读全文
posted @ 2013-03-16 08:56 幸福框架 阅读(18) | 评论 (0) 编辑
 
摘要: 1. 过去的事情可以不忘记,但一定要放下。 2. 收敛自己的脾气,偶尔要刻意沉默,因为冲动会做下让自己无法挽回的事情。 3. 无论什么时候,做什么事情,要思考。 4. 永远不要给背叛过自己的朋友第二次的背叛的机会。 5. 无论是谁,都有自己的限度。特别是信任。 6. 懂得倾听别人的忠告。 7. 别人说的记在脑袋里,而自己的,则放在心里。 8. 尽量不要讲同事朋友的八卦。 9. 偶尔也要现实和虚伪一点,因为不那样做的话,很难混。 10. 坦然接受生活给你的馈赠吧,不管是好的还是坏的。 11. 真正了解无常的含义,当你痛苦时,你要想这...阅读全文
posted @ 2013-03-15 14:05 幸福框架 阅读(21) | 评论 (0) 编辑
 
摘要: 了解同一个边界中的真正的不变量 聚合的划分是需要细心设计的,聚合划分时除了根据聚合本身的定义外还应该能保证聚合内部元素的一致性,当外界通过聚合根对聚合内的元素进行修改时能使改变的元素与其他元素之间保持设定的一致性,确保概念上的不变。 尽量设计小的聚合 聚合设计大多数时候都会受到主观因素的影响,有的人喜欢设计大聚合(聚合包含的实体和值对象数量太多),因为觉得大聚合容易获得聚合内的其他元素,这样做虽然表面上看起来很方便,但是存在很大的弊端,大聚合在进行数据操作时不容易控制,容易造成事务失败,因此应该尽量设计小的聚合。 不同聚合之间通过唯一标识来关联 聚合A和聚合B之间存在关联,并且在...阅读全文
posted @ 2013-03-14 11:21 幸福框架 阅读(18) | 评论 (1) 编辑
 
摘要: C# VIA CLRSQLExtJs阅读全文
posted @ 2013-03-13 09:00 幸福框架 阅读(21) | 评论 (0) 编辑
 
摘要: 聚合 = 聚合根 + 实体 + 值对象 + 导航约束: 只有“聚合根”可以被其它对象“导航”到,“内部实体”只能被临时使用。 ”内部实体“和”值对象“在概念上只被所在的聚合根使用(本地标识)。 ”内部实体“和”值对象“可以导航到其它”聚合根“。设计原则 同时生存同时消亡(充分条件)。 存在不变量(充分条件)。 容易管理并发(充分条件)。 不可缺少的一部分(充分条件)。 同时加载同时保存(充分必要条件)。阅读全文
posted @ 2013-03-12 18:26 幸福框架 阅读(34) | 评论 (1) 编辑
 
摘要: 业务事务面向用例,一般一个请求对应一个业务事务,一个业务事务对应多个数据库事务,一个业务事务运行在一个分布式事务中,一个数据库事务最好只操作一个聚合。 如何编排一个业务事务的多个数据事务呢?一、DomainService(推荐);二、DomainEvent(推荐);三、ApplicationService(不推荐)。 如何管理分布式事务呢?一、AOP;二、AOP、三、AOP。阅读全文
posted @ 2013-03-11 19:21 幸福框架 阅读(48) | 评论 (0) 编辑
 
摘要: 1、认真听别人讲,别人讲的时候要跟着对方的思路走。2、不要急于否定别别人,但是不怕被别人否定。3、遇到不理解的东西,记下来,找时机继续提问。4、交流过后,要说声谢谢。阅读全文
posted @ 2013-03-10 09:28 幸福框架 阅读(15) | 评论 (0) 编辑
 
摘要: Command:纵向传递,跨分层,在控制器层和应用层之间传递。DomainEvent:横向传递,跨聚合,在一个DLL中。ApplicationEvent:横向传递,跨模块,在不同的DLL中。阅读全文
posted @ 2013-03-09 13:48 幸福框架 阅读(31) | 评论 (1) 编辑
 
摘要: 1、识别模型(内部视图):实体、值对象、聚合、服务、工厂、仓储、领域事件。2、识别命令(外部视图):命令、处理器、应用事件。阅读全文
posted @ 2013-03-08 11:30 幸福框架 阅读(21) | 评论 (0) 编辑
 
摘要: 前者或许比后者要容易的多,多少次提醒自己要从小处着手,又多少次因为将其置之不理而让自己置于维护的恶梦中。强化一下不扫一室,何以扫天下。不积跬步,无以至千里。阅读全文
posted @ 2013-03-07 22:11 幸福框架 阅读(13) | 评论 (0) 编辑
 
摘要: 环境要求安装MSMQ示例代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using System.Messaging; 8 9 namespace MSMQStudy10 {11 class Program12 {13 static void Main(string[] args)14 {15 strin...阅读全文
posted @ 2013-03-06 15:03 幸福框架 阅读(13) | 评论 (0) 编辑
 
摘要: 用来组织业务逻辑面向业务逻辑。细粒度。内部视图看系统。一个请求对应多个服务的多个方法。服务之间会存在依赖。职责一般包括:夸聚合协调、没办法合理放到实体中的其它领域逻辑。阅读全文
posted @ 2013-03-05 11:11 幸福框架 阅读(30) | 评论 (0) 编辑
 
摘要: 直接看代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using System.Data.Entity; 8 9 namespace Study.CodeFirst 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 ...阅读全文
posted @ 2013-03-04 12:53 幸福框架 阅读(27) | 评论 (0) 编辑
 
摘要: OSGI面向“组件”编程的一种延伸。面向接口编程在“组件”层次的应用。管理“组件”的生命周期(加载、启动、停止、卸载)。实施OSGI的真正意义是合理的管理组件之间的依赖关系,甚至"强迫你做出合理的依赖"。ESB实现了基于”消息“的应用层组织模式。支持消息的”路由配置“,可以”编排“指定的消息经过哪些”组件“。可以实现类似”应用事件“的功能,但是其支持其它更多功能。IOC管理”组件“中服务的注册、获取及其生命周期管理,有些容器提供更多扩展。DDD是应对复杂性而生的中模式。其分上下文、分层、分区、分聚合,都是应对复杂性的更细粒度的模式。这种分割,最终要落实到”组件“层面,就用O阅读全文
posted @ 2013-03-03 10:43 幸福框架 阅读(26) | 评论 (1) 编辑
 
摘要: 用来封装业务逻辑面向用例。粗粒度。外部视图看系统。一个请求对应一个方法。服务之间不相互调用。职责一般包括:跨模块协调、DTO转换、事务AOP、权限AOP、日志AOP、异常AOP、邮件、消息队列。阅读全文
posted @ 2013-03-02 11:39 幸福框架 阅读(24) | 评论 (0) 编辑
 
摘要: 只有代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using Microsoft.Practices.Unity; 8 using Microsoft.Practices.Unity.InterceptionExtension; 9 10 namespace AOPStudy 11 { 12 class Program 13 { 14 ...阅读全文
posted @ 2013-03-01 21:10 幸福框架 阅读(67) | 评论 (2) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/2990756.html