专业的门户网站建设,局域网建设网站视频教程,商城网站如何优化,南宁做网站哪家好IOC模式和依赖注入是近年来非常流行的一种模式#xff0c;相信大家都不陌生了#xff0c;在Asp.Net Core中提供了依赖注入作为内置的基础设施#xff0c;如果仍不熟悉依赖注入的读者#xff0c;可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: ASP.NET Cor… 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.AddTypeILogger, Logger();//使用实例注册服务服务的生命周期限定为单例services.AddInstanceITaskService(new TaskService());//使用委托工厂注册服务services.AddDelegateITaskService, TaskService(resolver new TaskService()); 服务解析 AspectCore.Injector通过IServiceResolver来解析服务 //创建服务解析器IServiceResolver serviceResolver services.Build();//解析单个服务ISampleService sampleService serviceResolver.ResolveISampleService();//解析单个服务并且验证是否为null为null则抛出异常ISampleService sampleServiceRequired serviceResolver.ResolveRequiredISampleService();//解析服务集合如果未注册则为空集合IEnumerableISampleService sampleServices serviceResolver.ResolveManyISampleService(); 依赖注入 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.AddTypedSampleInterceptor();
}); 在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.RegisterTypeLogger().AsILogger().InstancePerDependency();containerBuilder.RegisterTypeTaskService().AsITaskService().InstancePerDependency();containerBuilder.RegisterTypeSampleRepository().AsISampleRepository().InstancePerDependencontainerBuilder.RegisterTypeSampleService2().AsISampleService().InstancePerDependency();container containerBuilder.Build(); var serviceContainer new ServiceContainer();serviceContainer.AddTypeILogger, Logger(Lifetime.Transient);serviceContainer.AddTypeITaskService, TaskService(Lifetime.Transient);serviceContainer.AddTypeISampleRepository, SampleRepository(Lifetime.Transient);serviceContainer.AddTypeISampleService, SampleService2(Lifetime.Transient);serviceResolver serviceContainer.Build();}[Benchmark] public object Autofac_Sample_Resolve() { return container.ResolveITaskService();}[Benchmark] public object AspectCore_Sample_Resolve() { return serviceResolver.ResolveITaskService();}[Benchmark] public object Autofac_PropertyInjection() { return container.ResolveISampleRepository();}[Benchmark] public object AspectCore_PropertyInjection() { return serviceResolver.ResolveISampleRepository(); } [Benchmark] public object Autofac_ConstructorInjection() { return container.ResolveISampleService(); } [Benchmark] public object AspectCore_ConstructorInjection() { return serviceResolver.ResolveISampleService(); } } 使用Release模式运行Benchmark BenchmarkDotNetv0.10.8, OSWindows 10 Threshold 2 (10.0.10586)
ProcessorIntel Core i5-4590 CPU 3.30GHz (Haswell), ProcessorCount4Frequency3215206 Hz, Resolution311.0221 ns, TimerTSC
dotnet cli version2.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 | 有问题反馈 SampleIoC-Sample 如果您有任何问题请提交 Issue 给我们。 Github : https://github.com/dotnetcore/AspectCore-Framework 原文地址http://www.cnblogs.com/liuhaoyang/p/dependencyinjection-in-aspectcore.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注