日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AspectCore中的IoC容器和依赖注入

發(fā)布時間:2023/12/4 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AspectCore中的IoC容器和依赖注入 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

IOC模式和依賴注入是近年來非常流行的一種模式,相信大家都不陌生了,在Asp.Net Core中提供了依賴注入作為內(nèi)置的基礎(chǔ)設(shè)施,如果仍不熟悉依賴注入的讀者,可以看看由我們翻譯的Asp.Net Core中文文檔中依賴注入的相關(guān)章節(jié):?ASP.NET Core 中文文檔 第三章 原理(10)依賴注入。基于IoC的重要性,AspectCore在提供Aop特性的同時,同樣提供了可以和Aop無縫集成使用的輕量級、高性能IoC容器AspectCore.Injector。

開始使用

AspectCore.Injector內(nèi)置在AspectCore.Core包中,我們可以通過nuget獲取

? Install-Package AspectCore.Core -pre

容器和服務(wù)注冊

在AspectCore.Injector中容器命名為IServiceContainer,使用容器的默認(rèn)實(shí)現(xiàn)來創(chuàng)建一個容器,并且提供了類型,實(shí)例,和工廠三種方式來注冊服務(wù):

IServiceContainer services = new ServiceContainer();//使用類型注冊服務(wù)services.AddType<ILogger, Logger>();//使用實(shí)例注冊服務(wù),服務(wù)的生命周期限定為單例services.AddInstance<ITaskService>(new TaskService());//使用委托工廠注冊服務(wù)services.AddDelegate<ITaskService, TaskService>(resolver => new TaskService());

服務(wù)解析

AspectCore.Injector通過IServiceResolver來解析服務(wù):

//創(chuàng)建服務(wù)解析器IServiceResolver serviceResolver = services.Build();//解析單個服務(wù)ISampleService sampleService = serviceResolver.Resolve<ISampleService>();//解析單個服務(wù),并且驗(yàn)證是否為null,為null則拋出異常ISampleService sampleServiceRequired = serviceResolver.ResolveRequired<ISampleService>();//解析服務(wù)集合,如果未注冊,則為空集合IEnumerable<ISampleService> sampleServices = serviceResolver.ResolveMany<ISampleService>();

依賴注入

AspectCore.Injector提供構(gòu)造器注入和屬性兩種方式:

public interface ISampleService{
}public class SampleService : ISampleService{ ?
private readonly ISampleRepository _sampleRepository; ?
private readonly ILogger _logger; ? ?//構(gòu)造器注入public SampleService(ISampleRepository sampleRepository, ILogger logger) ? ?{_sampleRepository = sampleRepository;_logger = logger;} }
public interface ISampleRepository{ }
public class SampleRepository : ISampleRepository{ ? ?//屬性注入。屬性注入的條件為標(biāo)記FromContainer特性,并且允許set。滿足條件的屬性自動注入[FromContainer] ?
public ILogger Logger { get; set; } }

生命周期

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

瞬時
瞬時(Transient)生命周期服務(wù)在它們每次請求時被創(chuàng)建。這一生命周期適合輕量級的,無狀態(tài)的服務(wù)。

作用域
作用域(Scoped)生命周期服務(wù)在每個作用域內(nèi)被創(chuàng)建一次。

單例
單例(Singleton)生命周期服務(wù)在它們第一次被解析時創(chuàng)建,并且每個后續(xù)解析將使用相同的實(shí)例。如果你的應(yīng)用程序需要單例行為,建議讓服務(wù)容器管理服務(wù)的生命周期而不是在自己的類中實(shí)現(xiàn)單例模式和管理對象的生命周期。

Aop集成

在AspectCore.Injector中默認(rèn)開啟在AspectCore.DynamicProxy的Aop集成,并可通過IServiceContainer的Configure方法進(jìn)行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){ ? ?//添加你的服務(wù)...//將IServiceCollection的服務(wù)添加到ServiceContainer容器中var container = services.ToServiceContainer(); ? ?return container.Build(); }

只需要兩行代碼即可在Asp.Net Core中使用AspectCore.Injector替換默認(rèn)的DependencyInjection。

性能

Autofac是目前.net/.net core較為流行的IoC容器之一,我們把Autofac(4.6.2版本)作為性能對比目標(biāo)。分別從解析簡單對象,屬性注入和構(gòu)造器注入三個方面對比性能。
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模式運(yùn)行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

如果您有任何問題,請?zhí)峤?Issue?給我們。
Github :?https://github.com/dotnetcore/AspectCore-Framework

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


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的AspectCore中的IoC容器和依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。