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 依赖注入的更多相关文章

  1. ASP.NET Core之依赖注入

    本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...

  2. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  3. 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...

  4. Asp.net core自定义依赖注入容器,替换自带容器

    依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...

  5. ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用

    话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...

  6. ASP.NET Core:依赖注入

    ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...

  7. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  8. 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

    这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...

  9. ASP.NET MVC IOC依赖注入之Autofac系列开篇

    Autofac为IOC组件,实现控制反转,主要结合面向接口编程,完成较大程度的解耦工作. 使用IOC,必须面向接口编程,所谓的面向接口编程,即程序中依赖于抽象,而不依赖于具体实现. 需要所有的业务逻辑 ...

随机推荐

  1. 在Vue中的load或ready的加载时机

    在Vue中的load或ready的加载时机 1.我们来插入一段代码来分析: Js代码如下 <script type="text/javascript"> var app ...

  2. Python-eval()函数

    python eval() eval(expression, globals= None, locals= None) --官方文档中的解释: 将字符串str当成有效的表达式子来求值并返回计算结果. ...

  3. win7 vs2012/2013 编译boost 1.55

    bjam install stage --toolset=msvc-11.0 --stagedir="C:\Boost\boost_vc_110" link=shared runt ...

  4. 【转】线程join()方法的含义

    在很多情况下,主线程生成并启动了子线程,如果子线程里要进行大量的耗时运算,主线程往往将于子线程之前结束,但是如果主线程处理完其它事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后 ...

  5. Linux内核之进程地址空间

    Linux内核之进程地址空间 内核中的函数以相当直接了当的方式获得动态内存: __get_free_pages 或 alloc_pages从分区页框分配器中获得页框; kmem_cache_alloc ...

  6. Golang -- Signal处理

    我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...

  7. linux mysql 定时备份 使用crontab

    第一步:在服务器上配置备份目录代码: mkdir /var/lib/mysqlbackup cd /var/lib/mysqlbackup 第二步:编写备份脚本代码:  vi dbbackup.sh ...

  8. lanmp安装

    下载安装(ssh登录服务器,执行如下操作即可,需要用到root用户权限来安装)源码编译安装wget http://dl.wdlinux.cn:5180/lanmp_laster.tar.gztar z ...

  9. Appium新版本不再支持ByName定位了怎么办

    appium版本在1.5以后就不再支持ByName的定位,本文章仅介绍在appium1.6.3/1.6.4/1.6.5版本下如何支持ByName定位,适用于安卓.在使用appium1.5之后的版本时, ...

  10. 修改oracle数据库允许连接的数

    当前连接数:select count(*) from v$process;查询数据库允许的最大连接数: select value from v$parameter where name = 'proc ...