摘要: 方法注入的条件: 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 风云 阅读(735) 评论(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 风云 阅读(684) 评论(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 风云 阅读(838) 评论(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 风云 阅读(1371) 评论(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 风云 阅读(2199) 评论(12) 推荐(2) 编辑
摘要: 组件工厂在创建组件时将通过一定的策略选定特定的构造函数,然后进行构造。构造函数的选择策略是:1. 如果遍历的构造函数如果含有参数,那么容器先检查创建上下文中是否含有指定的参数数组或命名参数字典,如果有则选择该构造函数,反之则遍历构造函数的参数,判断每一个参数是否可以进行注入,如果都可以进行注入则选择该构造函数2. 如果构造函数没有参数则选择该构造函数3. 将上面的两个步骤生成的构造函数列表进行按照构造函数参数的个数进行降序排列(构造函数的选择原则是参数越多将被首先选择) 4. 在步骤3的列表 中找出贴有InjectAttribute标签的构造函数,如果找到则选择该构造函数,如果找不到则选择步骤 阅读全文
posted @ 2010-07-06 15:16 风云 阅读(820) 评论(1) 推荐(1) 编辑
摘要: 1. 通过组件Id获取组件实例: [Test] public void GetByIdTest() { ServiceRegistry.Register<Person>("person"); var person = ServiceLocator.Get<IPerson>("person"); Assert.IsTrue(person != null); var person2 = ServiceLocator.Get<Person>("person"); Assert.IsTrue(person2 阅读全文
posted @ 2010-07-06 14:31 风云 阅读(635) 评论(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 风云 阅读(792) 评论(1) 推荐(1) 编辑
摘要: Mini容器支持6中生命周期类型: 1. Singleton :单利类型(缺省组件都是单利类型的生命周期,由容器进行托管的) [Test] public void SingletonLifestyleTest() { ServiceRegistry.Register<Person>(); var person = ServiceLocator.Get<IPerson>(); Assert.IsTrue(person != null); var person2 = ServiceLocator.Get<IPerson>(); Assert.IsTrue(per 阅读全文
posted @ 2010-07-06 13:54 风云 阅读(823) 评论(1) 推荐(1) 编辑
摘要: 一. 环境下载到Mini 容器的官方网站下载NLite框架的二进制文件,下载并解压后就可以了。我们使用NLite框架需要用到下面的文件:NLite.dll(必要)二. 建立NLite应用程序 新建一个控制台应用程序 HostMini 添加NLite.dll 引用 添加命名空间:using NLite;using NLite.Mini; 在主函数中添加创建Mini容器的代码:var container = new Kernel(); 创建契约接口IMessageSender 创建组件EmailSender 通过服务注册表注册组件EmailSender 通过服务定位器获取契约接口 调用契约方法: 阅读全文
posted @ 2010-07-06 13:06 风云 阅读(2708) 评论(0) 推荐(4) 编辑
摘要: Mini容器主要实现了两个接口,一个是服务注册表接口,一个是服务定位器接口。那么组件的注册就要依靠服务注册表接口IServiceRegistry了。IServiceRegistry接口的定义: public interface IServiceRegistry { IServiceRegistry Register(IComponentInfo info);//通过组件元数据注册组件到容器中 IServiceRegistry RegisterInstance(string id, object instance);//注册实例 IServiceRegistry RegisterInstance 阅读全文
posted @ 2010-07-06 13:01 风云 阅读(980) 评论(0) 推荐(2) 编辑
摘要: 通过上一篇文章简单学习了,环境搭建,这一篇将学习Mini容器的组件注册API的使用方法。当组件注册后,系统都会自动创建一个组件元数据类IComponentInfo 来对该组件进行绑定,系统根据组件元数据进行组件创建,依赖注入,动态代理植入,组件查找定位等,组件元数据在DI容器中的地位是非常重要的。组件元数据定义了以下几个重要的成员:组件Id属性:通过该Id可以唯一标记一个组件,服务定位器可以通过组件Id获取组件实例,当注册组件时如果没有提供组件Id,系统会自动根据组件类型的全名自动生成ServiceRegistry.Register<Person>("person&quo 阅读全文
posted @ 2010-07-06 12:18 风云 阅读(1942) 评论(2) 推荐(2) 编辑