随笔分类 - NLite
摘要:菜阿斌以前写了两篇很好的文章:为什么要让我们的“领域模型”裸奔?(上),(下),在我的 架构视角面面观中也介绍了领域逻辑经常被Web 组件Api、分布组件Api、ORM组件API、ADO API 等污染,上面的几篇文章讲了领域裸奔的重要性、以及常见项目中的领域被污染的问题,关于如何解决该问题, 网上关于这方面的介绍倒很少。本篇将介绍如何让我们的领域逻辑不被Web组件、分布组件所污染,解决该问题的主角将是NLite.WebAPI 组件,下面就让它登场吧。 NLite WebApi NLite web api 是基于NLite.Web和 Ndf的服务分发器引擎,并借助Asp.net 的ht...
阅读全文
摘要:NLite Web 组件的特点支持泛型Page支持Ndf内核的WebApi支持页面的DI、用户组件的DI注入支持Web页面方法的自动路由支持HttpListener,通过HttpListener自动扩展HttpModule拥有灵活强大的性能监视接口:监视Web页面,监视Ndf服务分发器,监视Nlite WebApiChange log for NLite.WebNUI 0.3(2013/2/20)基于http://nui.codeplex.com/SourceControl/changeset/100290版本1. 更新NLite.web依赖的组件2. 添加强签名支持3. 设置版本号 0.3
阅读全文
摘要:Change log for NLiteNLite 0.9.5.7(2013/2/11)基于http://nlite.codeplex.com/SourceControl/changeset/100168版本1. 支持强密钥2. 支持.NET 453. 支持Mono环境4. 版本号升级到0.9.5.7NLite 0.9.5.5(2012/12/30)基于http://nlite.codeplex.com/SourceControl/changeset/98939版本1. 修复获取枚举类型缺省值的Bug2. 优化DataReader到List的性能3. 支持DataReader到动态类型的转换4
阅读全文
摘要:DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害。本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入),揭开DI容器的神秘面纱。 一、定义DI容器接口 1: public interface IContainer 2: { 3: void Register<TService, TComponent>(bool isSingleton = false);//组件注册 4: objec...
阅读全文
摘要:关于什么是DI注入,很多人应该都很熟悉,如果不太熟悉,可以看看园友的一篇文章DI,DIP,IOC的演变历史。 DI 注入常常用在Mvc的项目或者领域层和持久层,但是如果DI注入能够和WebPage完美的结合起来,那就更完美了,那么下面就开始了。 新建Web项目-WebPageWithDI 打开Nuget控制台 并键入install-package nlite.web在Web配置文件中加入如下代码:<httpHandlers> <add path="*.aspx" verb="*" type="NLite.Web.PageHan
阅读全文
摘要:今天在群中有人问关于泛型类型的注册和使用。我在这里做一个简单的Demo例子ServiceRegistry.Current .Register(typeof(IList<>),typeof(List<>));//注册契约 IList<>,组件List<>Assert.IsTrue(ServiceRegistry.HasRegister(typeof(IList<>)));Assert.IsTrue(ServiceRegistry.HasRegister(typeof(IList<int>)));Assert.IsTrue(S
阅读全文
摘要:WebApi 这两天被dudu老大炒的老火了,看来我也需要加把柴了,呵呵。 NLite WebApi 是基于Ndf的服务分发器引擎,并借助Asp.net 的http原生态无状态协议的基础上搭建起来的,NLite Web api 完全无侵入性,不继承任何基类,只需要简单的配置即可把业务逻辑自动发不成NLite Web Api 服务, 简单易用,不废话,上过程! 服务端Nlite Web API的实现 需要准备的工具:Visual Studio 2010, NuGet(这两天现学了Nuget 包的制作,虽然去年简单学习并制作了NLite的包,不过早忘光了,看了dudu老大的WebApi介...
阅读全文
摘要:引言 对象和对象之间是通过消息来进行通信的。具体过程如下: 创建对象a 创建对象b 创建请求消息request 调用对象b的方法 对象b返回对应的response通过上面的过程可以看出通信的调用方需要依赖如下元素:被调用方 (服务契约)请求消息request( 数据契约)被调用方的方法(操作契约)响应消息(数据契约)那么我们可以把通信的过程通过引入一个间接层-服务分发器来解耦对象间的之间通信,具体过程如下: 创建对象a 创建服务分发器dipatcher 创建请求消息request 调用分发器的分发方法 分发器创建对象b,并调用对象b的方法 对象b返回对应的response 给分发器,分发器把.
阅读全文
摘要:背景 随着Asp.net mvc的越来越流行,关于和Mvc整合的DI容器也非常的多,而Mini容器一致没有把整合的方案发布出来,以至于不时的收到有些网友询问这些事,于是便有了该文。[源代码从这里下载,Mini容器官方地址]解决方案 创建自定义工厂 public class NLiteControllerFactory : DefaultControllerFactory { private IServiceLocator ServiceLocator; public NLiteControllerFactory(IServiceLocator s...
阅读全文
摘要:上篇介绍了DI容器最基本功能,组件注册和组件创建和组件获取。这里将陆续把依赖注入进行详细介绍。 1. 看看组件工厂接口-IActivator的代码: /// <summary> /// 组件工厂 /// </summary> public interface IActivator { /// <summary> /// 创建组件 /// </summary> /// <param name="ctx">创建上下文</param> /// <returns>返回所创建的组件</retur
阅读全文
摘要:DI容器在DotNet 中已经不是什么稀罕东西了,如Castle,Unity,Ninject,StructureMap,Spring,MEF等等,这些DI容器都是老外设计的,国内开发的DI容器是少之又少,Mini容器便是少之又少中的一员。关于Mini容器的介绍,请参考去年7月份写的这篇文章:Mini容器介绍。 DI容器核心功能包含2大件,服务注册表和服务定位器。 服务注册表:掌管服务的配置或注册,服务注册成功后,DI容器会生成组件的元数据信息包含: 组件Id标志(服务定位器根据该标志获取组件实例),如果组件在注册时未提供标志,那么系统根据组件类型动态生成一个标志 组件类型 契约接口集合,一个.
阅读全文
摘要:上篇介绍了 Class 创建性能大比拼(反射,泛型反射,泛型创建,缓存Emit,非缓存Emit), 在这里做一个总结(执行10万次)直接创建Class对象最快 5ms缓存Emit 6ms (不包含Emit时间)泛型反射147ms泛型创建159ms(其实是编译器的语法糖,内部仍然调用泛型反射)反射340ms非缓存Emit 12786ms 经过上面的对比应该很清楚了Class创建原则: 直接创建->用缓存Emit->泛型反射->泛型创建->反射(反射大约比直接调用慢68倍左右),避免非缓存Emit 这篇就来一个Struct创建性能大比拼。因为Struct和Class一个是值
阅读全文
摘要:一说到反射,很多人都想到了性能,更有甚者直接说“慎用反射,遗患无穷”,“用反射,感觉怎么像是退步啊~”,看到这种言论,直接把反射妖魔化了,如果这种言论长此以往,势必会对很多对反射初学者造成负面影响。反射是一把双刃剑,看你怎样使用了,下面我就用代码说话。class TestEntity { } 1. 手工创建TestEntity [TestInfo(Category = "Class.Constructor", Name = "Direct")] class DirectInvokeMode:IRunable { public void Run() { n
阅读全文
摘要:在大比拼之前先讲一个小插曲,我这个人以前比较低调,做了很多好东西仅仅在公司内的朋友圈项目圈内分享,很少在博客园内进行分享,后来在dudu 老大的文章博客园现代化建设——AutoMapper有感便推荐一下OOMapper 组件,于是乎接连写了几篇入门性的介绍使用文章:开发人员必备工具:OOMapperOO Mapper 实践(上篇)OO Mapper 实践(下篇) 在园友Repository兄的NLiteMapper与EmitMapper性能简单比较中了解到NLiteMapper与EmitMapper的性能巨大差距,于是乎进行了两天的性能优化,同时总结了优化过程:一次性能优化最佳实践。在这里非.
阅读全文
摘要:上周五下班前,在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 .
阅读全文
摘要:上篇介绍了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
阅读全文
摘要:上一篇介绍了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
阅读全文