MyIoc 的使用遵循 Register-Resolve-Release 这样一种模式。
我们先来看如何注册服务。注册一个服务其实非常简单。首先创建一个 IObjectContainer 实例,然后调用该实例的任何一个 Register 方法即可。请看代码:
1 var container = new ObjectContainer(true); 2 container.Register<IService, MyService>();
这里有几点要说明一下:首先说一下 ObjectContainer 对象的构造。这个对象包含几个构造函数。
1 public ObjectContainer() 2 public ObjectContainer(bool useLightweightCodeGeneration) 3 public ObjectContainer(bool useLightweightCodeGeneration, IConstructorSelector constructorSelector) 4 public ObjectContainer(ContainerOption option)
这些构造函数都是用于指定 ContainerOption。
Register 方法包含多个重载,其中主要提供四种注册服务的方式:
- 注册某个常量或现成的实例对象。
- 通过 Func 的方式注册某个服务。
- 通过 Type 方式注册服务,并指定使用 Reflection 方式来构建对象。
- 通过 Type 方式注册服务,并指定使用 Emit 方式来构建对象。
优化建议:
- 尽量使用泛型方式进行注册,这样可以在注册服务时避免反射开销,提高性能。
- 尽量少用 Func 方式进行注册,因为采用这种方式时,框架将无法跟踪服务的依赖项,从而无法在其依赖项注册/注销/激活/停用时通知服务使用者。而且使用 Func 方式注册时,框架每次都需要从注册表中查询依赖项,因而无法利用缓存提高性能。
- 如果所注册服务的生命周期为 Container 或某种 Singleton,不要显式指定采用 Emit 方式(默认不会采用这种方式)通过动态生成代码来构建对象,因为这类生命周期的对象仅构建一次,之后便复用该对象,不值得再承担动态生成代码这样的开销。
时间: 2024-11-29 11:18:59