HTML5技术

AspectCore中的IoC容器和依赖注入 - Lemon丶

字号+ 作者:H5之家 来源:H5之家 2017-10-20 09:07 我要评论( )

AspectCore中的IoC容器和依赖注入 IOC模式和依赖注入是近年来非常流行的一种模式,相信大家都不陌生了,在Asp.Net Core中提供了依赖注入作为内置的基础设施,如果仍不熟悉依赖注入的读者,可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: AS

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>().InstancePerDependen containerBuilder.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>(); } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • AspectCore.Extension.Reflection : .NET Core反射扩展库 - Lemon丶

    AspectCore.Extension.Reflection : .NET Core反射扩展库 - Lemon丶

    2017-10-19 09:00

  • 【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~ - 外婆的彭湖湾

    【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要

    2017-08-16 11:00

  • angular或者js如何确定选中ul中的哪几个li - 枫树下的风

    angular或者js如何确定选中ul中的哪几个li - 枫树下的风

    2017-08-16 10:01

  • 我眼中的ASP.NET Core之微服务 (二) - Savorboard

    我眼中的ASP.NET Core之微服务 (二) - Savorboard

    2017-07-21 11:00

网友点评
;