随笔分类 -  Mini DI容器

摘要:菜阿斌以前写了两篇很好的文章:为什么要让我们的“领域模型”裸奔?(上),(下),在我的 架构视角面面观中也介绍了领域逻辑经常被Web 组件Api、分布组件Api、ORM组件API、ADO API 等污染,上面的几篇文章讲了领域裸奔的重要性、以及常见项目中的领域被污染的问题,关于如何解决该问题, 网上关于这方面的介绍倒很少。本篇将介绍如何让我们的领域逻辑不被Web组件、分布组件所污染,解决该问题的主角将是NLite.WebAPI 组件,下面就让它登场吧。 NLite WebApi NLite web api 是基于NLite.Web和 Ndf的服务分发器引擎,并借助Asp.net 的ht... 阅读全文
posted @ 2013-02-21 00:40 风云 阅读(3094) 评论(6) 推荐(6) 编辑
摘要: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 阅读全文
posted @ 2013-02-20 12:23 风云 阅读(825) 评论(3) 推荐(0) 编辑
摘要: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 阅读全文
posted @ 2012-12-23 20:28 风云 阅读(896) 评论(1) 推荐(0) 编辑
摘要:DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害。本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入),揭开DI容器的神秘面纱。 一、定义DI容器接口 1: public interface IContainer 2: { 3: void Register<TService, TComponent>(bool isSingleton = false);//组件注册 4: objec... 阅读全文
posted @ 2012-07-13 11:13 风云 阅读(873) 评论(1) 推荐(1) 编辑
摘要:关于什么是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 阅读全文
posted @ 2012-06-13 14:41 风云 阅读(1844) 评论(4) 推荐(1) 编辑
摘要: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介... 阅读全文
posted @ 2012-05-12 23:14 风云 阅读(5186) 评论(21) 推荐(10) 编辑
摘要:背景 随着Asp.net mvc的越来越流行,关于和Mvc整合的DI容器也非常的多,而Mini容器一致没有把整合的方案发布出来,以至于不时的收到有些网友询问这些事,于是便有了该文。[源代码从这里下载,Mini容器官方地址]解决方案 创建自定义工厂 public class NLiteControllerFactory : DefaultControllerFactory { private IServiceLocator ServiceLocator; public NLiteControllerFactory(IServiceLocator s... 阅读全文
posted @ 2011-12-19 12:13 风云 阅读(1761) 评论(9) 推荐(2) 编辑
摘要:上篇介绍了DI容器最基本功能,组件注册和组件创建和组件获取。这里将陆续把依赖注入进行详细介绍。 1. 看看组件工厂接口-IActivator的代码: /// <summary> /// 组件工厂 /// </summary> public interface IActivator { /// <summary> /// 创建组件 /// </summary> /// <param name="ctx">创建上下文</param> /// <returns>返回所创建的组件</retur 阅读全文
posted @ 2011-04-22 17:12 风云 阅读(1625) 评论(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 风云 阅读(1974) 评论(7) 推荐(4) 编辑
摘要:在大比拼之前先讲一个小插曲,我这个人以前比较低调,做了很多好东西仅仅在公司内的朋友圈项目圈内分享,很少在博客园内进行分享,后来在dudu 老大的文章博客园现代化建设——AutoMapper有感便推荐一下OOMapper 组件,于是乎接连写了几篇入门性的介绍使用文章:开发人员必备工具:OOMapperOO Mapper 实践(上篇)OO Mapper 实践(下篇) 在园友Repository兄的NLiteMapper与EmitMapper性能简单比较中了解到NLiteMapper与EmitMapper的性能巨大差距,于是乎进行了两天的性能优化,同时总结了优化过程:一次性能优化最佳实践。在这里非. 阅读全文
posted @ 2011-04-13 12:49 风云 阅读(12747) 评论(46) 推荐(23) 编辑
摘要:在项目中常常会遇到多个组件都实现了同一个契约接口,那么在DI容器中怎么获取实现同一个契约接口的所有组件呢。答案是:IEnumerable<TContract> componets = ServiceLocator.GetAll<TContract>(); 上面的实现方案是目前主流的DI容器的解决方法。但是这种方法是通过服务定位器把资源拉过来的,而不是通过注入的方式推过来的,不符合DI注入传统设计规范。那么怎么能够更优雅的解决此类问题呢,MEF率先提供了一种方案ImportMany的方式来进行注入多个组件,当然MIni容器也不甘落后也很快就赶上了。下面看看Mini容器的例 阅读全文
posted @ 2011-04-07 12:46 风云 阅读(1612) 评论(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 风云 阅读(886) 评论(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 风云 阅读(1591) 评论(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 风云 阅读(724) 评论(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 风云 阅读(676) 评论(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 风云 阅读(828) 评论(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 风云 阅读(1361) 评论(1) 推荐(1) 编辑
摘要:Mini 容器学习笔记1——环境搭建(基础篇)Mini 容器学习笔记2——组件元数据(基础篇)Mini 容器学习笔记3——组件的注册(基础篇)Mini 容器学习笔记4——组件的生命周期(应用篇)Mini 容器学习笔记5——组件的获取Mini 容器学习笔记6——组件的获取(应用)Mini 容器学习笔记7——构造函数注入Mini 容器学习笔记8——字段注入Mini 容器学习笔记9——属性注入Mini 容器学习笔记10——方法注入Mini 容器学习笔记11——Lazy注入Mini 容器学习笔记12——组合实例Mini 容器学习笔记13——插件注入Mini 容器学习笔记14——异常处理Mini 容器学 阅读全文
posted @ 2010-07-06 15:29 风云 阅读(2193) 评论(12) 推荐(2) 编辑
摘要:组件工厂在创建组件时将通过一定的策略选定特定的构造函数,然后进行构造。构造函数的选择策略是:1. 如果遍历的构造函数如果含有参数,那么容器先检查创建上下文中是否含有指定的参数数组或命名参数字典,如果有则选择该构造函数,反之则遍历构造函数的参数,判断每一个参数是否可以进行注入,如果都可以进行注入则选择该构造函数2. 如果构造函数没有参数则选择该构造函数3. 将上面的两个步骤生成的构造函数列表进行按照构造函数参数的个数进行降序排列(构造函数的选择原则是参数越多将被首先选择) 4. 在步骤3的列表 中找出贴有InjectAttribute标签的构造函数,如果找到则选择该构造函数,如果找不到则选择步骤 阅读全文
posted @ 2010-07-06 15:16 风云 阅读(798) 评论(1) 推荐(1) 编辑
摘要:Mini容器主要实现了两个接口,一个是服务注册表接口,一个是服务定位器接口。那么组件的获取就要依靠服务定位器接口IServiceLocator。 IServiceLocator接口的定义:public interface IServiceLocator : IServiceProvider,IDisposable{ object Get(string id); object Get(Type serviceType); object Get(string id, IDictionary<string, object> args); object Get(Type serviceTy 阅读全文
posted @ 2010-07-06 14:10 风云 阅读(788) 评论(1) 推荐(1) 编辑