Autofac - 服务
上一篇中, 留了一个小问题,在一个接口下面, 注册多个类, 并能正常获取. 之前的方式是不能做到的, 在服务中, 有一种实现方式是可以的.
一、服务
1. 类型 - 描述服务的基本方法
上一篇其实使用到过这种方式, 只是并没有拿出来讲.
builder.RegisterType<Dog>().As<IAnimal>(); //-------------------------------------------------
var animal = container.Resolve<IAnimal>();
animal.Say();
这个方法, 就可以将IAnimal类型的服务与Dog的组件连接起来. 通过这个服务, 可以创建Dog的实例.
按照类型的服务在自动装配中, 也是管用的.
2. 别名
builder.RegisterType<Dog>().Named<IAnimal>("dog");
builder.RegisterType<Cat>().Named<IAnimal>("cat");
//-------------------------------------------------
var dog = container.ResolveNamed<IAnimal>("dog");
dog.Say();
Console.WriteLine();
var cat = container.ResolveNamed<IAnimal>("cat");
cat.Say();
从此方式来看, 是可以实现之前功能的. 在同一个接口下面, 注册多个类, 并正常获取他们的实体
Named方法, 本质上还是调用的As()方法
别名的方式, 有些宽泛, 这里我想怎么写都行, 没有什么约束(规范), 更不知道里面有些什么. 使用起来, 有些不是很方便.
对于这一点, autofac也是考虑到了的, 所以提供了另一种方式.
3. 键
首先建一个让人能看懂的枚举
public enum AnimalEnum
{
Dog,
Cat
}
有了这个实体之后, 就能知道, IAnimal服务下面, 可以注册那些类, 可以获取到那些类的实体
builder.RegisterType<Dog>().Keyed<IAnimal>(AnimalEnum.Dog);
builder.RegisterType<Cat>().Keyed<IAnimal>(AnimalEnum.Cat);
//-------------------------------------------------
var dog = container.ResolveKeyed<IAnimal>(AnimalEnum.Dog);
dog.Say();
Console.WriteLine();
var cat = container.ResolveKeyed<IAnimal>(AnimalEnum.Cat);
cat.Say();
Keyed<>()方法, 和Named<>()方法一样, 都是调用As()方法, 只是对值的限制有些不同.
从结果看, 与别名的方式, 是一样的. 不过有利就有弊, 虽然能清晰看到可用的类, 但是在扩展性上就差了一些, 如果你想新增一个类进去, 就得修改AnimalEnum枚举值.
除了上面两种获取方式之外, 还有一种Index索引的获取方式.
var iindex = container.Resolve<IIndex<string, IAnimal>>();
var cat = iindex["cat"];
cat.Say(); var index = container.Resolve<IIndex<AnimalEnum, IAnimal>>();
var dog = index[AnimalEnum.Dog];
dog.Say();
注册部分, 是跟之前是一样的, 只是取的时候不一样. 当不知道iindex["cat"]中, "cat"的具体值时, 这里报错几率会增加不少. 所以, 推荐还是使用下面枚举的那种
4. 遍历方式
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
//-------------------------------------------------
var list = container.ComponentRegistry.Registrations.ToList();
var s = container.ResolveComponent(list[], new List<Parameter>()) as Dog;
s.Say();
这里我首先注册当前运行的程序集, 然后, 通过Registrations获取到, 所有注册了的类型, 之后应该遍历这些类型, 找到你想要的,
然后调用ResolveComponent方法, 去获取实例. 这里我省懒了(某人比较懒), 哈哈. 此方式不推荐使用
参考:
Autofac - 服务的更多相关文章
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- NET Core 3.0 新姿势 将AutoFac替换内置DI
.NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServ ...
- NET Core 3.0 项目中使用 AutoFac
.net core 3.1 今天已正式发布,3.1跟3.0差别不是很大,主要是对 3.0一小部分修复和完善,最重要的是.NET Core 3.1是长期支持(LTS)版本,建议大家升级. .net co ...
- 最近的项目系之2——core3.0整合Autofac
1.前言 core3.0与之前版本相比,有一些brokenchanges,那周边一些配套组件往往也难逃brokenchanges,Autofac也不例外.这里重点关注core整合Autofac,与之前 ...
- NET Core 3.0 AutoFac替换内置DI的新姿势
原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...
- abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析
老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的D ...
- .NET5.0 依赖注入,关于 Autofac 使用
前置 工具 VS2019 概念 关于以下几个概念,自行百度. 控制反转:IoC(Inversion of Control) 依赖注入: 容器:DI 容器(.NET Core 自带),Autofac(本 ...
- Autofac 组件、服务、自动装配 《第二篇》
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- [翻译]Autofac 解析服务
注册组件以后,通过容器或 ILifetimeScope 的 Resolve 方法解析服务: var builder = new ContainerBuilder(); builder.Register ...
随机推荐
- objective-c(类别)
objective-c中的Categary(类别)使用相当广泛,其内涵类似于javascript中的prototype,可以扩展某一个类的方法. 下面给出一个基本的例子,参考oc程序设计一书: 实现一 ...
- 作业3.2:psp
PSP2.1 Personal Software Process Stages Time Planning 计划 20min Estimate 估计这个任务需要多长时间 3.5h Developmen ...
- 项目八:团队项目——Alpha阶段项目总结
1.项目的预期目标 a.完成游戏的基本功能 b.游戏难度的玩家手动调节 c.游戏能够良好的运行完成 与前期的需求分析对比: 第一点不同是游戏的难度调节,原来是想通过选择难度来调节的,但由于难度的分层上 ...
- [ACM_动态规划] 找零种类
问题描述:假设某国的硬币的面值有 1.5.10.50 元四种,输入一个金额 N (正整数,N<=1000),印出符合该金额的硬币组合有多少种. 问题分析: 1.5.10 元组合出 N 元的方法数 ...
- [HIMCM暑期班]第1课:概述
作为这个系列的开始,我会把每一节课上过的内容,与同学们互动后发现他们的闪光点记录下来,以后其他要准备该比赛的人借鉴和参考. 第一节课是概述,主要讲什么是数学建模,还有建模可以帮助我们做什么.举了三个例 ...
- iOS--二维码
现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来iOS7自带二维码扫码的教程,也包括扫条形码,足以满足简单的扫码要求,而且避免使用第三方的繁琐. 后期项目中 ...
- Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制
之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下 ...
- 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...
- [转载]TFS安装配置教程
最近公司新开发一个项目要用微软的TFS2013进行项目的源代码管理,以前只是用过SVN,从来没有用过TFS,所以在网上百度.谷歌了好一阵子来查看怎么安装和配置,还好花了一天时间总算是初步的搞定了,下面 ...
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...