04 2011 档案

摘要:上篇介绍了DI容器最基本功能,组件注册和组件创建和组件获取。这里将陆续把依赖注入进行详细介绍。 1. 看看组件工厂接口-IActivator的代码: /// <summary> /// 组件工厂 /// </summary> public interface IActivator { /// <summary> /// 创建组件 /// </summary> /// <param name="ctx">创建上下文</param> /// <returns>返回所创建的组件</retur 阅读全文
posted @ 2011-04-22 17:12 风云 阅读(1635) 评论(3) 推荐(2) 编辑
摘要:DI容器在DotNet 中已经不是什么稀罕东西了,如Castle,Unity,Ninject,StructureMap,Spring,MEF等等,这些DI容器都是老外设计的,国内开发的DI容器是少之又少,Mini容器便是少之又少中的一员。关于Mini容器的介绍,请参考去年7月份写的这篇文章:Mini容器介绍。 DI容器核心功能包含2大件,服务注册表和服务定位器。 服务注册表:掌管服务的配置或注册,服务注册成功后,DI容器会生成组件的元数据信息包含: 组件Id标志(服务定位器根据该标志获取组件实例),如果组件在注册时未提供标志,那么系统根据组件类型动态生成一个标志 组件类型 契约接口集合,一个. 阅读全文
posted @ 2011-04-21 17:45 风云 阅读(1984) 评论(7) 推荐(4) 编辑
摘要:上篇介绍了 Class 创建性能大比拼(反射,泛型反射,泛型创建,缓存Emit,非缓存Emit), 在这里做一个总结(执行10万次)直接创建Class对象最快 5ms缓存Emit 6ms (不包含Emit时间)泛型反射147ms泛型创建159ms(其实是编译器的语法糖,内部仍然调用泛型反射)反射340ms非缓存Emit 12786ms 经过上面的对比应该很清楚了Class创建原则: 直接创建->用缓存Emit->泛型反射->泛型创建->反射(反射大约比直接调用慢68倍左右),避免非缓存Emit 这篇就来一个Struct创建性能大比拼。因为Struct和Class一个是值 阅读全文
posted @ 2011-04-19 11:18 风云 阅读(2786) 评论(14) 推荐(2) 编辑
摘要:一说到反射,很多人都想到了性能,更有甚者直接说“慎用反射,遗患无穷”,“用反射,感觉怎么像是退步啊~”,看到这种言论,直接把反射妖魔化了,如果这种言论长此以往,势必会对很多对反射初学者造成负面影响。反射是一把双刃剑,看你怎样使用了,下面我就用代码说话。class TestEntity { } 1. 手工创建TestEntity [TestInfo(Category = "Class.Constructor", Name = "Direct")] class DirectInvokeMode:IRunable { public void Run() { n 阅读全文
posted @ 2011-04-18 16:37 风云 阅读(4230) 评论(24) 推荐(7) 编辑
摘要:在大比拼之前先讲一个小插曲,我这个人以前比较低调,做了很多好东西仅仅在公司内的朋友圈项目圈内分享,很少在博客园内进行分享,后来在dudu 老大的文章博客园现代化建设——AutoMapper有感便推荐一下OOMapper 组件,于是乎接连写了几篇入门性的介绍使用文章:开发人员必备工具:OOMapperOO Mapper 实践(上篇)OO Mapper 实践(下篇) 在园友Repository兄的NLiteMapper与EmitMapper性能简单比较中了解到NLiteMapper与EmitMapper的性能巨大差距,于是乎进行了两天的性能优化,同时总结了优化过程:一次性能优化最佳实践。在这里非. 阅读全文
posted @ 2011-04-13 12:49 风云 阅读(12807) 评论(46) 推荐(23) 编辑
摘要:上周五下班前,在Repository兄测试NLiteMapper和EmitMapper的文章中,发现了令我跌破眼镜的性能悬殊对比12283ms : 7ms。真不可思议,与是便把EmitMapper的源代码和OOMapper 的源代码一起下载下来,以Release模式的方式做一个公平对比。测试代码仍然沿用Repository兄的,代码如下:public class SimpleClassFrom { public long ID { get; set; } public string Name { get; set; } public int Age { get; set; } public . 阅读全文
posted @ 2011-04-11 11:28 风云 阅读(4053) 评论(17) 推荐(3) 编辑
摘要:上篇介绍了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 风云 阅读(3241) 评论(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 风云 阅读(4218) 评论(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 风云 阅读(7059) 评论(20) 推荐(3) 编辑
摘要:在项目中常常会遇到多个组件都实现了同一个契约接口,那么在DI容器中怎么获取实现同一个契约接口的所有组件呢。答案是:IEnumerable<TContract> componets = ServiceLocator.GetAll<TContract>(); 上面的实现方案是目前主流的DI容器的解决方法。但是这种方法是通过服务定位器把资源拉过来的,而不是通过注入的方式推过来的,不符合DI注入传统设计规范。那么怎么能够更优雅的解决此类问题呢,MEF率先提供了一种方案ImportMany的方式来进行注入多个组件,当然MIni容器也不甘落后也很快就赶上了。下面看看Mini容器的例 阅读全文
posted @ 2011-04-07 12:46 风云 阅读(1625) 评论(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 风云 阅读(897) 评论(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 风云 阅读(1642) 评论(1) 推荐(2) 编辑

点击右上角即可分享
微信分享提示