.Net Core中依赖注入服务使用总结
一、依赖注入
引入依赖注入的目的是为了解耦和。说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用。这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将实现类替换。上面的说的通过接口调用方法,实际上还是需要去实例化接口的实现类,只不过不需要我们手动new 构造实现类,而是交给如微软的DI、Autofac这些工具去构建实现类。我们只需要告诉它们,某个类是某个接口的实现类,当用到的时候,工具会自动通过构造函数实例化类。
二、.Net Core中自带的DI
本来想写依赖注入源码的讲解的,看到网上有篇文章关于源码讲解的,很详细、清楚,就不再写了。地址:http://www.cnblogs.com/bill-shooting/p/5540665.html。我在这里就说说使用吧。
依赖注入有三种生命周期,每种生命周期的注入方式大同小异,下面我以作用域生命周期举例,其他两种跟这个不同,我会特别说明。
下面为用到的两个服务。
public class UserService : IUserService
{
public string GetName()
{
return "UserName";
}
} public interface IUserService
{
string GetName();
}
public class ConfigReader : IConfigReader
{
private string configFilePath;//需要传一个路径,去读取路径下文件的内容
public ConfigReader(string configFileName)
{
this.configFilePath = configFileName;
}
public string Reader()
{
return File.ReadAllText(configFilePath);
}
} public interface IConfigReader
{
string Reader();
}
1、最常用的注入方式,以接口形式暴露服务
services.AddScoped(typeof(IUserService), typeof(UserService));
services.AddScoped<IUserService, UserService>();
两种注入方式是一个意思,这种方式适合实现类为无参构造函数或者有参构造函数中参数已经被注入过了。
2、自己注入自己,以实现形式暴露服务
services.AddScoped<UserService>();
services.AddScoped(typeof(UserService));
这种注入方式适合只有实现类,没有借口类的注册。
3、需要传参的构造函数的类的注入
services.AddScoped<IConfigReader, ConfigReader>(x => { return new ConfigReader("c:/a.txt"); });
services.AddScoped<IConfigReader>(x => { return new ConfigReader("c:/a.txt"); });
services.AddScoped(typeof(IConfigReader), x => { return new ConfigReader("c:/a.txt"); });
前两个匿名方法参数是IServiceProvider,返回值为一个实例,第三个返回值是Object。上面举的例子没有用到IServiceProvider ,下面再举一个例子。修改上面的UserService类,将构造方法需要一个IConfigReader参数。
public class UserService : IUserService
{private IConfigReader configReader; public UserService(IConfigReader configReader)
{
this.configReader = configReader;
}
public string GetName()
{
return "UserName" + configReader.Reader();
}
}
注册的时候,如下:
services.AddScoped<IConfigReader, ConfigReader>(x => { return new ConfigReader("c:/a.txt"); });
//通过ServiceProvider获取已经注册的IConfigReader
services.AddScoped<IUserService, UserService>(x => { return new UserService(x.GetService<IConfigReader>()); });
//或者
services.AddScoped<IUserService, UserService>(x => { return new UserService(new ConfigReader("c:/a.txt")); });
单例类型的生命周期多了两种注入方式:
services.AddSingleton<IConfigReader>(new ConfigReader("c:/a.txt"));
services.AddSingleton(typeof(IConfigReader), new ConfigReader("C:/a.txt"));
自带的依赖注入工具也可以批量注入
var assembly = Assembly.GetExecutingAssembly()
.DefinedTypes
.Where(a => a.Name.EndsWith("Service") && !a.Name.StartsWith("I")); foreach (var item in assembly)
{
services.AddTransient(item.GetInterfaces().FirstOrDefault(), item);
}
注意:当一个服务有多个实现时,调用的时候通过 IEnumerable<IPayService> PayServices 获取所有的实现服务。
services.AddTransient<IPayService, AliPayService>();
services.AddTransient<IPayService, WeChatPayService>();
使用的时候:
三、Autofac
1、以接口形式暴露服务
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); var builder = new ContainerBuilder();
builder.Populate(services); builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope(); var container = builder.Build();
return new AutofacServiceProvider(container);
}
2、通过实现类暴露服务
builder.RegisterType<UserService>();
3、需要传参的构造函数的类的注入
builder.Register(c => new ConfigReader("c:/a.txt")).As<IConfigReader>();
4、通过程序集注入
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(c => c.Name.EndsWith("Service"))
.AsImplementedInterfaces();
总结:
不论是微软的依赖注入组件还是Autofac 原理都是先将接口和对应的实现类注入到容器中,当要使用的时候,组件会自动通过构造函数创建实例。这里有个问题如果有个实现类有多个构造函数,组件会找满足参数最多的那个构造函数。
.Net Core中依赖注入服务使用总结的更多相关文章
- .NET Core 中依赖注入框架详解 Autofac
本文将通过演示一个Console应用程序和一个ASP.NET Core Web应用程序来说明依赖注入框架Autofac是如何使用的 Autofac相比.NET Core原生的注入方式提供了强大的功能, ...
- 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...
- .NET Core 中依赖注入 AutoMapper 小记
最近在 review 代码时发现同事没有像其他项目那样使用 AutoMapper.Mapper.Initialize() 静态方法配置映射,而是使用了依赖注入 IMapper 接口的方式 servic ...
- asp.net core 系列 3 依赖注入服务
一. 依赖注入概述 在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S).开放封闭原则(O).里氏替换原则(L).接口分离原则(I).依赖反转原则(D). ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- 几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...
- 重新整理 .net core 实践篇————依赖注入应用[二]
前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...
随机推荐
- asp.net中异步调用WebService(异步页)[转]
由于asp2.0提供了异步页的支持使异步调用WebService的性能有了真正的提升.使用异步页,首先要设置Async="true",异步页是在Prerender和Prerende ...
- 备份/还原MySQL数据库----MySQL Workbench
点击[Data Export],界面右侧将显示数据导出窗口. 2 点击[Refresh]按钮,刷新数据库列表(1),选择要导出的数据表(2),设置导出的目录(3),点击[Start Export]按钮 ...
- 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- Hibernate映射--基本类映射和对象关系映射(转)
原文地址:http://blog.csdn.net/lovesummerforever/article/details/20901011 尊重原创,请访问原网址 回想一些我们在没有学习ssh的时候 ...
- C++STL(vector,map,set,list,bitset,deque)成员函数整理
补充: vector 删除指定元素: vec.erase(remove(vec.begin(), vec.end(), val), vec.end());remove()返回的是删 ...
- PLSQL查询最近编绎、创建、修改过的过程函数
SELECT * FROM User_Objects t WHERE t.Object_Type IN ('PROCEDURE', 'PACKAGE BODY', 'FUNCTION') AND t. ...
- 原 requirements.txt 介绍 & 快捷生成
requirements.txt介绍 requirements.txt 文件 里面记录了当前程序的所有依赖包及其精确版本号. 这个文件有点类似与Rails的Gemfile.其作用是用来在另一台 ...
- BZOJ1345:[Baltic2007]序列问题
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- CentOS6 下Samba服务器的安装与配置
原地址:http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html 一.简介 Samba是一个能让Linux系统应用Microsoft网 ...
- lvs+keepalived和haproxy+heartbeat区别
最近一直在看一些高可用性的负载均衡方案,当然那些f5之类的硬件设备是玩不起也接触不到了.只能看这些for free的开源方案. 目前使用比较多的就是标题中提到的这两者,其实lvs和haproxy都是实 ...