AspectCore中的IoC容器和依赖注入

IOC模式和依赖注入是近年来非常流行的一种模式,相信大家都不陌生了,在Asp.Net Core中提供了依赖注入作为内置的基础设施,如果仍不熟悉依赖注入的读者,可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: ASP.NET Core 中文文档 第三章 原理(10)依赖注入。基于IoC的重要性,AspectCore在提供Aop特性的同时,同样提供了可以和Aop无缝集成使用的轻量级、高性能IoC容器AspectCore.Injector

开始使用

AspectCore.Injector内置在AspectCore.Core包中,我们可以通过nuget获取

   Install-Package AspectCore.Core -pre

容器和服务注册

在AspectCore.Injector中容器命名为IServiceContainer,使用容器的默认实现来创建一个容器,并且提供了类型,实例,和工厂三种方式来注册服务:

IServiceContainer services = new ServiceContainer();//使用类型注册服务services.AddType<ILogger, Logger>();//使用实例注册服务,服务的生命周期限定为单例services.AddInstance<ITaskService>(new TaskService());//使用委托工厂注册服务services.AddDelegate<ITaskService, TaskService>(resolver => new TaskService());

服务解析

AspectCore.Injector通过IServiceResolver来解析服务:

//创建服务解析器IServiceResolver serviceResolver = services.Build();//解析单个服务ISampleService sampleService = serviceResolver.Resolve<ISampleService>();//解析单个服务,并且验证是否为null,为null则抛出异常ISampleService sampleServiceRequired = serviceResolver.ResolveRequired<ISampleService>();//解析服务集合,如果未注册,则为空集合IEnumerable<ISampleService> sampleServices = serviceResolver.ResolveMany<ISampleService>();

依赖注入

AspectCore.Injector提供构造器注入和属性两种方式:

public interface ISampleService{
}public class SampleService : ISampleService{  
private readonly ISampleRepository _sampleRepository;  
private readonly ILogger _logger;    //构造器注入public SampleService(ISampleRepository sampleRepository, ILogger logger)    {_sampleRepository = sampleRepository;_logger = logger;} }
public interface ISampleRepository{ }
public class SampleRepository : ISampleRepository{    //属性注入。属性注入的条件为标记FromContainer特性,并且允许set。满足条件的属性自动注入[FromContainer]  
public ILogger Logger { get; set; } }

生命周期

AspectCore.Injector提供以下生命周期:

瞬时
瞬时(Transient)生命周期服务在它们每次请求时被创建。这一生命周期适合轻量级的,无状态的服务。

作用域
作用域(Scoped)生命周期服务在每个作用域内被创建一次。

单例
单例(Singleton)生命周期服务在它们第一次被解析时创建,并且每个后续解析将使用相同的实例。如果你的应用程序需要单例行为,建议让服务容器管理服务的生命周期而不是在自己的类中实现单例模式和管理对象的生命周期。

Aop集成

在AspectCore.Injector中默认开启在AspectCore.DynamicProxy的Aop集成,并可通过IServiceContainer的Configure方法进行Aop的配置。

services.Configure(config =>
{config.Interceptors.AddTyped<SampleInterceptor>();
});

在Asp.Net Core中使用AspectCore.Injector

安装AspectCore.Extensions.DependencyInjection nuget包

    Install-Package AspectCore.Extensions.DependencyInjection -pre

在修改ConfigureServices:

public IServiceProvider ConfigureServices(IServiceCollection services){    //添加你的服务...//将IServiceCollection的服务添加到ServiceContainer容器中var container = services.ToServiceContainer();    return container.Build();
}

只需要两行代码即可在Asp.Net Core中使用AspectCore.Injector替换默认的DependencyInjection。

性能

Autofac是目前.net/.net core较为流行的IoC容器之一,我们把Autofac(4.6.2版本)作为性能对比目标。分别从解析简单对象,属性注入和构造器注入三个方面对比性能。
Benckmark类编写如下:

[AllStatisticsColumn]
[MemoryDiagnoser]public class Benckmarks{    private readonly IServiceResolver serviceResolver;    private readonly IContainer container;    public Benckmarks()    {        var containerBuilder = new ContainerBuilder();containerBuilder.RegisterType<Logger>().As<ILogger>().InstancePerDependency();containerBuilder.RegisterType<TaskService>().As<ITaskService>().InstancePerDependency();containerBuilder.RegisterType<SampleRepository>().As<ISampleRepository>().InstancePerDependencontainerBuilder.RegisterType<SampleService2>().As<ISampleService>().InstancePerDependency();container = containerBuilder.Build();        var serviceContainer = new ServiceContainer();serviceContainer.AddType<ILogger, Logger>(Lifetime.Transient);serviceContainer.AddType<ITaskService, TaskService>(Lifetime.Transient);serviceContainer.AddType<ISampleRepository, SampleRepository>(Lifetime.Transient);serviceContainer.AddType<ISampleService, SampleService2>(Lifetime.Transient);serviceResolver = serviceContainer.Build();}[Benchmark]  
 public object Autofac_Sample_Resolve()    {      
   return container.Resolve<ITaskService>();}[Benchmark]    
 public object AspectCore_Sample_Resolve()    {    
    return serviceResolver.Resolve<ITaskService>();}[Benchmark]    
 public object Autofac_PropertyInjection()    {    
    return container.Resolve<ISampleRepository>();}[Benchmark]  
  public object AspectCore_PropertyInjection()    {    
      return serviceResolver.Resolve<ISampleRepository>();    }    [Benchmark]  
    public object Autofac_ConstructorInjection()    {    
        return container.Resolve<ISampleService>();    }    [Benchmark]    public object AspectCore_ConstructorInjection()    {        return serviceResolver.Resolve<ISampleService>();    } }

使用Release模式运行Benchmark:

BenchmarkDotNet=v0.10.8, OS=Windows 10 Threshold 2 (10.0.10586)
Processor=Intel Core i5-4590 CPU 3.30GHz (Haswell), ProcessorCount=4Frequency=3215206 Hz, Resolution=311.0221 ns, Timer=TSC
dotnet cli version=2.0.0[Host]     : .NET Core 4.6.00001.0, 64bit RyuJITDefaultJob : .NET Core 4.6.00001.0, 64bit RyuJIT|                          Method |        Mean |         Min |         Max |         Op/s |  Gen 0 | Allocated ||-------------------------------- |------------:|------------:|------------:|-------------:|-------:|----------:||          Autofac_Sample_Resolve |   494.83 ns |   482.52 ns |   506.58 ns |  2,020,908.9 | 0.2384 |     752 B ||       AspectCore_Sample_Resolve |    88.52 ns |    87.92 ns |    89.31 ns | 11,296,837.3 | 0.0279 |      88 B ||       Autofac_PropertyInjection | 2,014.46 ns | 2,004.18 ns | 2,028.83 ns |    496,411.0 | 0.5875 |    1856 B ||    AspectCore_PropertyInjection |   307.55 ns |   303.61 ns |   310.74 ns |  3,251,544.6 | 0.1063 |     336 B ||    Autofac_ConstructorInjection | 1,465.71 ns | 1,454.43 ns | 1,480.38 ns |    682,263.5 | 0.6084 |    1920 B || AspectCore_ConstructorInjection |   284.94 ns |   283.55 ns |   286.05 ns |  3,509,500.8 | 0.0987 |     312 B |

有问题反馈

Sample:IoC-Sample

如果您有任何问题,请提交 Issue 给我们。
Github : https://github.com/dotnetcore/AspectCore-Framework

原文地址:http://www.cnblogs.com/liuhaoyang/p/dependencyinjection-in-aspectcore.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpClient的性能隐患

最近在进行开发过程中&#xff0c;基于都是接口开发&#xff0c;A站接口访问B接口接口来请求数据&#xff0c;而在这个过程中我们使用的是HttpClient这个框架&#xff0c;当然也是微软自己的框架&#xff0c;性能当前没有问题&#xff0c;但如果你直接使用官方的写法&#xff0…

【填坑】博客搬家造成的博客重复问题

原本我的博客数量是差不多八十几篇&#xff0c;昨天晚上一看&#xff0c;怎么变成一百三十多篇了。 惊讶之余有点不可思议&#xff0c;查了才发现原来有几十篇是重复的&#xff0c;后来删掉了一些&#xff0c;但还是有很多 有些也不是重复的&#xff0c;我从知乎发的东西也被搬…

使用acs-engine在Azure中国区部署kubernetes集群详解

1. acs-engine简介 ACS是微软在2015年12月推出的一项基于容器的云端PaaS服务。说简单点&#xff0c;acs-engine就是一个ARM模板生成器&#xff0c;用户只需要配置几个简单的参数来描述容器集群的规格&#xff0c;然后acs-engine将这个容器集群描述文件转化成一组ARM&#xff08…

Lyft的TypeScript实践

来自Lyft的前端工程师Mohsen Azimi介绍了Lyft向TypeScript转型的过程&#xff0c;说明JavaScript类型系统的重要性、为什么Lyft选择TypeScript以及他们的一些实践经验。以下内容翻译自作者的博客&#xff0c;查看原文TypeScript at Lyft。 在我刚刚成为JavaScript开发者的时候&…

【Python】Conda的安装

挖个坑&#xff0c;以后自己慢慢填&#xff1a;下载conda后无法使用 conda优势&#xff1a;conda将几乎所有的工具、第三方包都当做package对待&#xff0c;甚至包括python和conda自身&#xff01;因此&#xff0c;conda打破了包管理与环境管理的约束&#xff0c;能非常方便地…

Java AIO 编程

转载自 java aio 编程 Java NIO (JSR 51)定义了Java new I/O API&#xff0c;提案2000年提出,2002年正式发布。 JDK 1.4起包含了相应的API实现。 JAVA NIO2 (JSR 203)定义了更多的 New I/O APIs&#xff0c; 提案2003提出&#xff0c;直到2011年才发布&#xff0c; 最终在JDK …

通过Swashbukle给DotNet Core Web API 增加自动文档功能

DotNet Core Web API给开发者提供了一个很好的框架来开发Restful的API。那么这些API接口该如何管理起来呢&#xff1f;Swagger是一个很好的选择&#xff0c;Swagger不需要开发者额外去维护接口文档&#xff0c;只要开发者的接口遵循Restful的规范&#xff0c;Swagger就会根据AP…

【Python】urllib爬取动漫图片

首先附上需要爬取图片的网站&#xff0c;应该算是个冷门网站&#xff0c;够练手用的了&#xff0c;我的博客图片大部分来自于这里 二次元图片网站 筛选src里的数据 用par r’<img src"[^"].jpg">可以筛选出带有里面的内容 htmldasdas <img src"…

【Python】字符串和变量拼接的写法

我的需求是改变url地址的后缀&#xff0c;其他不改&#xff0c;所以直接for循环&#xff0c;变换数字就行 也就是 字符串变量字符串 想着改变后缀就能批量爬图。但是原本的想法是错误的 for num in range(2,8):url"http://www.win4000.com/wallpaper_detail_160877_"…

【学校作业】学生数据打印

数据结构课程布置了一门c语言的结构体作业 要求&#xff1a; 五个学生&#xff0c;数据包括学号&#xff0c;姓名&#xff0c;3门课的成绩&#xff0c;从键盘输入5个学生的数据。打印出3门课总平均成绩&#xff0c;以及最高分 强迫症患者表示打印出的数据必须美观&#xff0c; …

Entity Framework Core 2.0 使用入门

一.前言 Entity Framework&#xff08;后面简称EF&#xff09;作为微软家的ORM&#xff0c;自然而然从.NET Framework延续到了.NET Core。以前我也嫌弃EF太重而不去使用它&#xff0c;但是EF Core&#xff08;Entity Framework Core&#xff09;已经做了很多性能优化&#xff0…

JavaFX中WebView的java与JS代码互相调用

java代码 package main;import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.scene.w…

Jexus~docker与它产生了暖味

前段时间写了很多docker for .net core的文章&#xff0c;用来快速部署微服务相当给力&#xff0c;而尝到了香头的我们希望把.net frameworks的程序也使用docker来部署一下&#xff0c;那么接下来我就结果一下&#xff0c;在linux,docker上运行和部署.net frameworks应用程序的…

ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明

一.ABP的简单介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点&#xff0c;它旨在成为一个通用的WEB应用程序框架和项目模板。 ASP.NET Boilerplate 基于DDD的经典分层架构思想…

【Python】Scrapy的安装与使用

scrapy的安装 不得姐网站 直接用命令 pip install scrapy 网络可能较慢&#xff0c;等等就好 另外windows环境下你还需要安装win32 我之前就是因为没有安装这个库&#xff0c;白忙活了一天&#xff0c;一直都是报错状态 pip install pypiwin32 scrapy的使用 cd到卓面或者其他…

[译]ASP.NET Core 2.0 带初始参数的中间件

问题 如何在ASP.NET Core 2.0向中间件传入初始参数&#xff1f; 答案 在一个空项目中&#xff0c;创建一个POCO&#xff08;Plain Old CLR Object&#xff09;来保存中间件所需的参数&#xff1a; public class GreetingOptions { public string GreetAt { get; set; } …

框架学习与探究之AOP--Castle DynamicProxy

前言 先说一点废话&#xff0c;在此之前博主也在早期就接触了或者看了些许AOP相关的文章&#xff0c;然后再去做了一些相关的实验&#xff0c;但是始终没有将AOP内化到自己的内功心法当中去&#xff0c;包括从概念还是应用环境&#xff0c;以及当前生态当中的AOP工具等等&#…

【LSB】图片隐写文档大纲

第一章 绪论 1.1研究背景 1.2研究意义 1.3主要工作 第二章 图片隐写和LSB算法 2.1关于图片隐写术 2.2LSB算法 第三章 系统设计与实现 3.1图像的加载 3.2文本的预编码 3.3文字编码 3.4图片编码 第四章 功能测试及线上部署 4.1功能测试 4.2线上部署 第五章 总结及展望 5.1总结…

.NET下使用HTTP请求的正确姿势

一、前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的分析后对HttpClient有了一定的了解。前几日也有园友写了一篇关于HttpClient的分析文章, 于是我想深入探索一下在.NET下使用HTTP请求的正确姿势。姿势不是越多越好, 而在于精不精。如果不深入了解…

【LSB】图片隐写主体函数

关于图像隐写 图像隐写是一种有效的方式来交换隐藏的消息&#xff0c;而不会引起怀疑。它的工作原理是用lbs算法将消息编码为图像像素的颜色值。 这种功能基于浏览器的最新特性比如File API和Canvas&#xff0c;如果你的浏览器不支持该该功能&#xff0c;请下载最新的浏览器。…