摘要: 上篇介绍了OO Mapper 最核心的映射,简单类型映射,这篇将介绍的复合类型的映射。 1. Dictionary - > Dictionary 字典类型分为:IDictionary,IDictioanry<TKey,TValue> public class SourceValue { public int Value { get; set; } } public class DestValue { public int Value { get; set; } } [Test] public void Example() { var sourceDict = new Dict 阅读全文
posted @ 2011-04-08 15:53 风云 阅读(3231) 评论(11) 推荐(3) 编辑
摘要: 上一篇介绍了OO Mapper的作用以及支持的功能。这一篇将以上一篇为提纲进行实践。 准备工作:下载NLite编译NLite 项目创建一个NUnit单元测试项目添加NLite.dll 引用添加 : using NLite; 实践: 1. Any -> StringAssert.AreEqual("5", Mapper.Map<int, string>(5)); 2. primitive->Enum,Enum->primitive [TestFixture] public class EnumTests { public enum En1 : b 阅读全文
posted @ 2011-04-08 12:50 风云 阅读(4209) 评论(6) 推荐(6) 编辑
摘要: 昨天看了dudu 老大的文章博客园现代化建设——AutoMapper有感便推荐一下OOMapper 组件,诚然OOMapper 组件是站在巨人的肩膀上,如AutoMapper,EmitMapper,以及Codeplex上所有类似组件上都做了借鉴,也重新发明了轮子,但是在发明轮子的过程中个人的积累也在提升。 OO Mapper 是NLite组件库中的一个组件,它是一个对象到对象转换的映射工具,常常用于把复杂的对象转化为DTO对象。 OO Mapper 支持以下映射功能: Any -> String Primitive -> Enum Enum -> Primitive Null 阅读全文
posted @ 2011-04-08 11:45 风云 阅读(7052) 评论(20) 推荐(3) 编辑
摘要: 在项目中常常会遇到多个组件都实现了同一个契约接口,那么在DI容器中怎么获取实现同一个契约接口的所有组件呢。答案是:IEnumerable<TContract> componets = ServiceLocator.GetAll<TContract>(); 上面的实现方案是目前主流的DI容器的解决方法。但是这种方法是通过服务定位器把资源拉过来的,而不是通过注入的方式推过来的,不符合DI注入传统设计规范。那么怎么能够更优雅的解决此类问题呢,MEF率先提供了一种方案ImportMany的方式来进行注入多个组件,当然MIni容器也不甘落后也很快就赶上了。下面看看Mini容器的例 阅读全文
posted @ 2011-04-07 12:46 风云 阅读(1616) 评论(3) 推荐(3) 编辑
摘要: Lazy注入指的是在注入的成员变量或构造函数参数变量或函数参数变量的类型上包裹一个Lazy类型,该注入方式是借鉴了MEF思想。具体代码: [TestFixture] public class LazyInjectionTest:TestBase { [Contract] interface ISimpleContract { } class SimpleComponent : ISimpleContract { } class HostComponent { [Inject] public Lazy<ISimpleContract> contract; } [Test] publi 阅读全文
posted @ 2011-04-07 11:50 风云 阅读(889) 评论(1) 推荐(1) 编辑
摘要: Mini容器的插件注入是通过InjectMany的方式来注入多个组件的方式进行的,插件的元数据通过标签的方式进行配置,Mini容器在注入插件的过程中同时也可以把插件的元数据一起注入,这和MEF实现插件框架是一样的。 下面看看Mini容器怎样来实现插件架构的。 1. 定义插件接口契约,插件元数据标签以及插件元数据接口 //插件接口 [Contract] public interface IAddIn { void Start();//启动插件 } //插件配置元数据标签 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]. 阅读全文
posted @ 2011-04-07 10:42 风云 阅读(1595) 评论(1) 推荐(2) 编辑
摘要: 方法注入的条件: 1. 方法必须是实例方法 2. 方法必须有参数 3. 方法上必须贴有标签InjectAttribute 方法注入最佳原则 1. 当需要注入的方法的访问权限是私有时,应该把方法所属的类标记为密封类,具体原因请大家猜一猜。 2. 当类标记为密封类时,该类应该实现一个或多个契约接口(当如果需要对该类进行Aop拦截时,可以进行接口代理)样例代码学习: class Person4 : IPerson { public string Name { get; set; } public IHorse Horse { get; private set; } public bool HasVi 阅读全文
posted @ 2010-07-06 17:44 风云 阅读(730) 评论(1) 推荐(1) 编辑
摘要: 属性注入的条件: 1. 属性必须是实例字段 2. 属性上必须贴有标签InjectAttribute或InjectManyAttribute 3. 属性必须有Setter访问器 4. 属性不能是索引属性 属性注入最佳原则 1. 当需要注入的属性的访问权限是私有时,应该把属性所属的类标记为密封类,具体原因请大家猜一猜。 2. 当类标记为密封类时,该类应该实现一个或多个契约接口(当如果需要对该类进行Aop拦截时,可以进行接口代理)样例代码学习: [TestFixture] public class PropertyInjectionTest : TestBase { [Contract] inter 阅读全文
posted @ 2010-07-06 17:29 风云 阅读(680) 评论(1) 推荐(1) 编辑
摘要: 字段注入的条件: 1. 字段必须是实例字段 2. 字段不能是只读字段 3. 字段上必须贴有标签InjectAttribute或InjectManyAttribute字段注入最佳原则1. 当需要注入的字段的访问权限是私有时,应该把字段所属的类标记为密封类,具体原因请大家猜一猜。2. 当类标记为密封类时,该类应该实现一个或多个契约接口(当如果需要对该类进行Aop拦截时,可以进行接口代理)样例代码学习: [Contract] interface ISampleContract { void Test(); } [Contract] interface IFieldContract { } seale 阅读全文
posted @ 2010-07-06 17:16 风云 阅读(833) 评论(1) 推荐(1) 编辑
摘要: 背景 最早在开发Mbs 中的插件架构时用服务定位器和服务注册表来屏蔽各大DI容器的差异,后来为了更深入的研究DI 容器的内部实现机制,便开发了Mbs DI容器->Mini容器前身,在开发过程中借鉴了Castle,Unity,Ninject,StructureMap,Spring等思想尤其是Castle容器的工厂以及生命周期管理器等思想。最近一段时间不太忙便重新整理Mbs框架,由于Mbs框架命名不是太好(最早是开发消息总线的),不能描述框架具体包含什么内容,于是便开发Nlite 框架,该框架旨在提供一个轻量级的组件库(DI,Aop,MessageBus, MVP,AddIn,OO Mapp 阅读全文
posted @ 2010-07-06 16:48 风云 阅读(1364) 评论(1) 推荐(1) 编辑