asp.net core ioc 依赖注入
1.生命周期
内置的IOC有三种生命周期:
Transient: Transient服务在每次被请求时都会被创建。这种生命周期比较适用于轻量级的无状态服务。
Scoped: Scoped生命周期的服务是每次web请求被创建。
Singleton: Singleton生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用同一个实例。如果你的应用需要单例服务,推荐的做法是交给服务容器来负责单例的创建和生命周期管理,而不是自己来走这些事情。
在Startup的ConfigureServices方法中
调用方法
services.AddSingleton(typeof(IMyService),new MyService());
也可以services.AddSingleton(typeof(IMyService),typeof(MyService));
最好还是services.AddSingleton<IMyService, MyService>();
因为这样的话可以在MyService中通过构造函数注入其他服务。
2.注册程序集的所有类
//通过反射把所有服务接口进行了注入:
var serviceAsm = Assembly.Load(new AssemblyName("Service"));
foreach (Type serviceType in serviceAsm.GetTypes()
.Where(t => typeof(IServiceTag).IsAssignableFrom(t) && !t.GetTypeInfo().IsAbstract))
{
var interfaceTypes = serviceType.GetInterfaces();
foreach (var interfaceType in interfaceTypes)
{
services.AddSingleton(interfaceType, serviceType);
}
}
3.其他类注入
在其他类怎么使用注入?假如在ExceptionFilter中想调用IUserService怎么办?要确保ExceptionFilter不是new出来的,而是IOC创建出来
services.AddSingleton<ExceptionFilter>();
//mvc core中注册filter要在AddMvc的回调方法中注册。
services.AddMvc(options =>
{
var serviceProvider = services.BuildServiceProvider();
var filter = serviceProvider.GetService<ExceptionFilter>();
options.Filters.Add(filter);
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
手动获取注入
在HttpContext可用的时候,也可以通过这种方法来解析服务:
public IActionResult Index()
{
IMyDependency idService = (IMyDependency)HttpContext.RequestServices.GetService(typeof(IMyDependency));
return View();
}
内置服务
asp.net mvc core中架注入了很多服务:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

最有用的就是IHostingEnvironment,其中主要成员有:WebRootPath属性(wwwroot文件夹的物理路径);ContentRootPath属性(网站根目录的物理路径)。
Microsoft.AspNetCore.Hosting下的HostingEnvironmentExtensions下还提供了一些扩展方法:
IsDevelopment()是否是开发环境、IsProduction()是否是生产环境。
asp.net mvc core中没有Server.MapPath()方法,根据你要定位的文件是不是在wwwroot下,你可以使用IHostingEnvironment. WebRootPath或者IHostingEnvironment. ContentRootPath来进行拼接。
public class HomeController : Controller
{
private IHostingEnvironment iHostingEnvironment;
public HomeController(IHostingEnvironment iHostingEnvironment)
{
this.iHostingEnvironment = iHostingEnvironment;
}
public IActionResult Index()
{
IHostingEnvironment host = new HostingEnvironment();
host.WebRootPath = iHostingEnvironment.WebRootPath;
host.ContentRootPath = iHostingEnvironment.ContentRootPath;
host.ApplicationName = iHostingEnvironment.ApplicationName;
host.EnvironmentName = iHostingEnvironment.EnvironmentName;
// host.ContentRootFileProvider = iHostingEnvironment.ContentRootFileProvider;
// host.WebRootFileProvider = iHostingEnvironment.WebRootFileProvider;
return View(host);
}
...
}

指定要由 web 主机使用的环境
Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseEnvironment("Development") //指定要由 web 主机使用的环境。
.UseStartup<Startup>();
asp.net core ioc 依赖注入的更多相关文章
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- 几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...
- Asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- ASP.NET Core:依赖注入
ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
- 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...
- ASP.NET MVC IOC依赖注入之Autofac系列开篇
Autofac为IOC组件,实现控制反转,主要结合面向接口编程,完成较大程度的解耦工作. 使用IOC,必须面向接口编程,所谓的面向接口编程,即程序中依赖于抽象,而不依赖于具体实现. 需要所有的业务逻辑 ...
随机推荐
- 20165231 2017-2018-2 《Java程序设计》第8周学习总结
教材学习内容总结 进程与线程 程序是一段静态的代码,它是应用软件执行的蓝本. 进程是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过 ...
- mysql配置修改项
[mysqld] innodb_locks_unsafe_for_binlog = 1 transaction-isolation = READ-COMMITTED 作用:防死锁 ,提高并发入库速度
- Go语言中的结构体 (struct)
Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑.本文主要对struct结构体的相关的语法进行总结和说明. ...
- Memcache的安装和使用【转】
转自:https://www.cnblogs.com/caoxiaojian/p/5715573.html Memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问 ...
- JS的Ajax和同源策略
JS实现的ajax AJAX核心(XMLHttpRequest) 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象.所有的异步交互都是使用XMLHttpSer ...
- Nginx负载均衡实例
upstream MyServers{ server 192.168.63.137; server 192.168.63.138; server 192.168.63.140; } server{ l ...
- druid:java代码创建连接池
PropertiesDB 是一个读取配置文件的类,也可以不用,每个参数直接用String代替. public DataSource dataSource(PropertiesDB properties ...
- 1)requests模块
一:requests 介绍 requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装, 从而使得Pyt ...
- CentOS 7 服务器之间ssh无密码登录、传输文件
在Linux服务器之间使用ssh命令向另一个Linux服务器发送执行指令是需要输入密码 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一 ...
- python 面向对象编程(初级篇)
飞机票 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最 ...