公司网站建设的作用与意义,网站排名快速见效的方法,wordpress中页面编辑,网站好看的图标代码07 | 用Autofac增强容器能力#xff1a;引入面向切面编程#xff08;AOP#xff09;的能力这一节讲解使用第三方框架来扩展依赖注入容器什么情况下需要我们引入第三方容器组件#xff1f;大部分情况下#xff0c;默认的容器组件足够使用当需要一些非常特殊的场景如下… 07 | 用Autofac增强容器能力引入面向切面编程AOP的能力这一节讲解使用第三方框架来扩展依赖注入容器什么情况下需要我们引入第三方容器组件大部分情况下默认的容器组件足够使用当需要一些非常特殊的场景如下1、基于名称的注入需要把一个服务按照名称来区分它的不同实现的时候2、属性注入直接把服务注册到某一个类的属性里面去而不需要定义构造函数比如之前的 FromService 和 构造函数入参3、子容器可以理解为之前讲过的 Scope但实际上还可以用第三方的框架实现一些特殊的子容器4、基于动态代理的 AOP需要在服务中注入额外的行为的时候可以用动态代理的能力.NET Core 的依赖注入框架它的核心扩展点是 IserviceProviderFactory第三方的依赖注入容器都是用了这个类来作为扩展点把自己注入到整个框架里来也就是说在使用这些依赖注入框架的时候不需要关注说谁家的特性谁家的接口是什么样子只需要关注官方核心的定义就可以了不需要直接依赖这些框架源码链接https://github.com/witskeeper/geektime/tree/master/samples/DependencyInjectionAutofacDemo服务namespace DependencyInjectionAutofacDemo.Services
{public interface IMyService{void ShowCode();}public class MyService : IMyService{public void ShowCode(){Console.WriteLine($MyService.ShowCode:{GetHashCode()});}}public class MyServiceV2 : IMyService{/// summary/// 用于演示属性注入的方式/// /summarypublic MyNameService NameService { get; set; }public void ShowCode(){// 默认情况下NameService 为空如果注入成功则不为空Console.WriteLine($MyServiceV2.ShowCode:{GetHashCode()},NameService是否为空{NameService null});}}public class MyNameService{}
}接下来看一下如何集成 Autofac使用 Autofac 是因为它是 .NET 社区里面最老牌的容器框架之一它有两个包Autofac.Extensions.DependencyInjectionAutofac.Extras.DynamicProxy引入这两个包就可以使用它来达到之前说的四种能力引入这两个包后需要在 Program 中添加一行代码.UseServiceProviderFactory(new AutofacServiceProviderFactory())UseServiceProviderFactory 是用于注册第三方容器的入口还有一个改动在 Startup 中我们需要添加一个 ConfigureContainer 方法它的入参是 Autofac 的 ContainerBuilderpublic void ConfigureContainer(ContainerBuilder builder)现在有两个 ConfigureServices一个是默认的一个是 ConfigureContainer服务注册进默认的容器之后实际上会被 Autofac 接替然后执行 ConfigureContainerAutofac 的注册方式与之前的注册方式不同先注册具体的实现然后再告诉它想把它标记为哪个服务的类型与之前的写法相反builder.RegisterTypeMyService().AsIMyService();接下来是命名注册当需要把一个服务注册多次并且用不同命名作为区分的时候可以用这种方式入参是一个服务名builder.RegisterTypeMyServiceV2().NamedIMyService(service2);如何使用它呢public ILifetimeScope AutofacContainer { get; private set; }public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// 注册根容器this.AutofacContainer app.ApplicationServices.GetAutofacRoot();// Autofac 容器获取实例的方式是一组 Resolve 方法var service this.AutofacContainer.ResolveNamedIMyService(service2);service.ShowCode();...启动程序输出如下MyServiceV2.ShowCode:61566768,NameService是否为空True