1 向容器中配置实例化对象
TestClass test = new TestClass();
//创建ioc容器
var builder = new ContainerBuilder();
// 注册服务和依赖
builder.RegisterInstance(test); //注入已经创建的核心配置对象
使用时直接调用
//读取引擎核心配置
TestClass test = IOCContainer.Resolve<TestClass>();
2 使用模块化配置时,注入实例化对象
查找相关资料,使用Module时并不支持使用以下这种方式向Module中注入实例化对象。
builder.RegisterType<MyService>().PropertiesAutowired();
经过思考,要向Module中注入对象,发现有两种实现方式,一种是显式调用,参数设置为实例化的对象。
TestClass config = new TestClass();
builder.RegisterModule(new PluginManageModule(config));
另一种则是配置延迟,将配置信息转移到Module里。
3 与Type结合
一般是涉及到反射。
使用Type配置
builder.RegisterType(type);
使用Type读取
var instance = (AbstractBase)IOCContainer.ResolveOptional(plugin);
这里的ResolveOptional会处理容器内的对象,如果未找到相关的对象,则返回null;使用Resolve的话,未找到对象则直接报错。
关于Type,还有更魔幻的操作,正常来说,如果要获取集合的话,是以下这种形式。
var arms = container.Resolve<IEnumerable<AbstractArm>>();
这里用到的类名,但是,在一些场景中(动态添加),没有类名,只有Type,还想要获取集合的话,就需要用到以下的形式。
//就需要使用typeof(IEnumerable<>).MakeGenericType(type)
//这相当于typeof(IEnumerable<Class>)
var plugins = container.ResolveOptional(typeof(IEnumerable<>)
.MakeGenericType(type));