自学内容网 自学内容网

Autofac工具实现依赖注入的特殊用法

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(abstractPluginItem.ClassType));

原文地址:https://blog.csdn.net/cun_king/article/details/142769248

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!