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(type));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纸照片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值