通过上一篇文章简单学习了,环境搭建,这一篇将学习Mini容器的组件注册API的使用方法。
当组件注册后,系统都会自动创建一个组件元数据类IComponentInfo 来对该组件进行绑定,系统根据组件元数据进行组件创建,依赖注入,动态代理植入,组件查找定位等,组件元数据在DI容器中的地位是非常重要的。
组件元数据定义了以下几个重要的成员:
组件Id属性:通过该Id可以唯一标记一个组件,服务定位器可以通过组件Id获取组件实例,当注册组件时如果没有提供组件Id,系统会自动根据组件类型的全名自动生成
ServiceRegistry.Register<Person>("person");
组件契约列表属性:一个组件可以继承一个契约基类或实现了一个或多个契约接口。当容器注册组件时,容器首先把组件自身类型作为契约添加到组件契约列表,然后扫描组件的 及所实现的接口是否标记有 ContractAttribute标签,如果含有标签ContractAttribute则把基类和接口添加到契约接口集合中。
[Contract]
interface IPerson
{
string Name { get; set; }
}
class Person : IPerson
{
public string Name { get; set; }
public static bool HasVisited;
public Person()
{
HasVisited = true;
}
}
ServiceRegistry.Register<Person>();
Person 组件就有两个契约类型IPerson和Person
组件类型属性:DI容器中的组件工厂会根据组件类型来创建组件实例。该组件类型是空值的话,那么组件元数据中必须有一个自定义工厂类型或工厂方法委托函数来创建组件。 当组件类型是抽象类型(接口或抽象类)时,那么组件对应的组件工厂就必须是代理工厂了,否则就会抛异常了
组件工厂类型属性:组件工厂的作用是创建组件的,Mini容器提供以下组件工厂
DefaultActivator : 缺省工厂,通过构造函数来进行对象创建
DelegateActivator :委托工厂,通过委托函数进行对象创建
InstanceActivator :实例工厂,该工厂仅仅是实例对象的占位器而已
var p = new Person();
p.Name = "Test !";
ServiceRegistry.Current.RegisterInstance(p);
Assert.IsTrue(ServiceRegistry.HasRegister<IPerson>());
var person = ServiceLocator.Get<IPerson>();
Assert.IsNotNull(person);
Assert.AreSame(p, person);
ProxyActivator :代理工厂,该工厂创建一个被植入后的组件实例,常常和Aop一块使用
如果以上工厂不能满足你的需求可以自定工厂
组件对象的生命周期类型属性:生命周期类型对应一个生命周期管理器
生命周期类型 | 生命周期管理器 | 描述 |
Singleton | SingletontLifestyleManager | 单利 |
Thread | ThreadLifestyleManager | 线程,在线程内是单利的 |
Transient | TransientLifestyleManager | 临时,每次请求组件实例都返回一个新的实例,该实例不会被容器管理 |
GenericSingleton | GenericSingletonLifestyleManager | 泛型单利 |
GenericThread | GenericThreadLifestyleManager | 泛型线程,在线程内是泛型组件是单利的 |
GenericTransient | GenericTransientLifestyleManager | 泛型临时 |
组件的扩展属性:包含一些扩展元数据,供组件监听器使用来扩展DI容器的功能
组件的工厂方法委托属性:
ServiceRegistry.Current.Register<IPerson>(() => new Person()); Assert.IsTrue(ServiceRegistry.HasRegister<IPerson>()); var person = ServiceLocator.Get<IPerson>(); Assert.IsTrue(person != null); var person2 = ServiceLocator.Get<IPerson>(); Assert.IsTrue(person2 != null); Assert.AreSame(person, person2); Assert.IsTrue(Person.HasVisited);
下一篇:Mini 容器学习笔记3——组件的注册(基础篇)
Mini 容器官方网站:
推荐资源: