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,必须面向接口编程,所谓的面向接口编程,即程序中依赖于抽象,而不依赖于具体实现. 需要所有的业务逻辑 ...
随机推荐
- CF1091F New Year and the Mallard Expedition
题目地址:CF1091F New Year and the Mallard Expedition 题意比较复杂,整理一下: \(n\) 段,每段有两个属性:长度,地形(G,W,L) 有三种运动方式: ...
- python中模块的__all__属性
python模块中的__all__属性,可用于模块导入时限制,如:from module import *此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入. ...
- LwIP Application Developers Manual8---Sample lwIP applications
1.前言 你已经编译lwIP协议栈在你的目标平台上,并且网络驱动正常工作.你可以ping你的设备. 干得好,为你感到骄傲.虽然一个设备可以响应ping,但并不能算一个完整的应用. 现在你可以通过网络接 ...
- requests支持socks5代理了
记录下 以前: import socket import socks from requests_html import HTMLSession session=HTMLSession() socks ...
- redis启动异常
在官网上下载redis包,解压后启动. 启动redis报下面的错误! *** FATAL CONFIG FILE ERROR *** Reading the configuration file, a ...
- jquery获取浏览器URL参数
getRequestParams:function(param){ var reg = new RegExp("(^|&)" + param + "=([^&am ...
- copy之深浅拷贝
深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...
- $Django 图片验证刷新 上传头像
1.图片验证刷新 $('img').click(function () { $('img')[0].src+='?' }) 2.上传头像 1.模板 <div class="form-g ...
- datatables日常使用集合
datatables CDN链接地址: <link rel="stylesheet" type="text/css" href="https:/ ...
- encoding and Endian
Unicode, Code Point is the value of evry character in Unicode table(int,long,ll) Unicode defines a c ...