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,一经查实,立即删除!

相关文章

[编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

【题目描述】求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。#include<iostream> using namespace std;void fun(int n) {long long sn0,s1;for(int i1;i<n;i){for(int j1;j<i;j){s*j;}sns;s1;}cout<<sn<<endl; }int main() {int n;c…

bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4381 题目大意 有n个岛&#xff0c;n条无向边(保证每个岛都有边连到)。走过的路和岛不可以重走&#xff0c;可以坐船。 坐船要求之前没有任何使用过的船加上道路可以到达那个点才可以坐船。 求最长可…

【总结】找到自适合的学习方法

通过高中与大学的比较 我发现自己大学学的东西要比高中多很多&#xff0c;也要更加的充实。 说白了&#xff0c;其实我认为就是自己擅长与不擅长的学习方式罢了。 1、我更喜欢那种自由轻松一点的学习环境&#xff0c;高中把我压得太紧了&#xff08;老师喜欢提问&#xff09…

HttpClient的性能隐患

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

P5022-旅行【基环树,dfs】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP5022 题目大意 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 解题思路 我们先不考虑基环树。我们可以发现每次走…

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

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

[编程入门]猴子吃桃的问题

猴子吃桃问题。猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c;见只剩下一个桃子了…

Javafx的WebEgine执行window对象设置属性后为undefined

一、场景复现 window10 jdk1.8u221 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.Sta…

P4168-[Violet]蒲公英【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4168 题目大意 询问区间众数 解题思路 将数字离散化&#xff0c;然后分块。对于数组vi,j,kv_{i,j,k}vi,j,k​&#xff0c;表示i∼ji\sim ji∼j个块&#xff0c;kkk的个数。对于询问(l,r)(l,r)(l,r)&…

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

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

C++描述杭电OJ 2011.多项式求和 ||

C描述杭电OJ 2011.多项式求和 || Problem Description 多项式的描述如下&#xff1a; 1 - 1/2 1/3 - 1/4 1/5 - 1/6 … 现在请你求出该多项式的前n项的和。 Input 输入数据由2行组成&#xff0c;首先是一个正整数m&#xff08;m<100&#xff09;&#xff0c;表示测试实…

【Java】continue和break区别

先总结下&#xff1a;break先跳出整个大的循环&#xff0c;而continue跳出的是相对小的循环 也就是说他们的区别核心在于循环的大小 就举个例子吧&#xff0c;用for循环从一数到十&#xff0c;到五用上break和continue的区别 用break&#xff1a; public class test_01 { pu…

JS中令人发指的valueOf方法介绍

转载自 JS中令人发指的valueOf方法介绍 彭老湿近期月报里提到了valueOf方法&#xff0c;兴致来了翻了下ECMA5里关于valueOf方法的介绍&#xff0c;如下&#xff1a; 15.2.4.4 Object.prototype.valueOf ( ) When the valueOf method is called, the following steps are take…

P3203-[HNOI2010]弹飞绵羊【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3203 题目大意 nnn个装置。到第iii个装置会被往前弹aia_iai​个。 两种操作 修改aia_iai​和询问从iii出发要多少次弹射可以弹出去。 解题思路 分块。对于每个点&#xff0c;维护要多少步弹出该块和弹…

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;能非常方便地…

C++描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 ||

C描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 || Problem Description 青年歌手大奖赛中&#xff0c;评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分&#xff0c;然后计算平均得分&#xff0c;请编程输出某选手的得分。 Input 输入数据有多组&#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 …

P1494-[国家集训队]小Z的袜子【分块优化莫队】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1494 题目大意 区间任意取两个数&#xff0c;求取到相同的数的概率。 解题思路 假设一个区间有x个y&#xff0c;那么两个都取到y的方案数是x∗(x−1)x*(x-1)x∗(x−1)&#xff0c;那么取到相同总共方…

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

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