【NetCore】05-使用Autofac增强容器能力

1.什么情况下需要引入第三方容器组件

  • 基于名称的注入
  • 属性注入
  • 子容器
  • 基于动态代理的AOP

核心扩展点:IServiceProviderFactory

第三方注入容器均使用这个类作为扩展点,将其注入到框架中,所以使用者只需关注官方定义的接口,而不用过多关注第三方容器

// 定义接口及实现
public interface IMyService
{
	void ShowCode();
}

public class MyService : IMyservice
{
	public void ShowCode()
	{
		Console.WriteLine($"MyService.ShowCode:{GetHashCode()}");
	}
}

public class MyServiceV2 : IMyservice
{
	public MyNameService NameService {get;set;}//用于演示属性注入方式
	public void ShowCode()
	{
		Console.WriteLine($"MyServiceV2.ShowCode:{GetHashCode()},NameService是否为空:{NameService==null}");
	}
}

public class NameService
{
	
}

2.如何集成Autoface

step 1 安装依赖包
1.Autofac.Extensions.DependencyInjection ⇒ 依赖注入包
2.Autofac.Extras.DynamicProxy ⇒ 动态代理包

step 2 Program添加代码

public static IHostBuilder CreateHostBuilder(string[] args) => 
		Host.CreateDefaultBuilder(args)
		.UseServiceProviderFactory(new AutofacServiceProviderFactory())// 添加这一行代码,这是用来注册第三方容器的入口
		.ConfigureWebHostDefaults(webBuilder => 
		{
			webBuilder.UserStartup<Startip>();
		});

step 3 Startup添加方法ConfigureContainer

// 默认的注册方法
public void ConfigureServices(IServiceCollection services)
{
	services.AddControllers().AddControllerAsServices();
}

// Autofac注册方法
public void ConfigureContainer(ContainerBuilder builder)
{
	builder.RegisterType<MyService>().As<IMyService>();
	// 命名注册,用于一个服务注册多次,并用命名来进行区分
	builder.RegisterType<MyServiceV2>().Named<IMyservice>("service2");
	
	// 属性注册
	builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();
	
	// AOP
	builder.RegisterType<MyInterceptor>();// 拦截器
	//builder.RegisterType<MyNameService>();
	builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();

	// 子容器
	builder.RegisterType<MyNameService>().InstancePerMatchingLifetimeScope("myscope");
}

public class MyInterceptor : IInterceptor
{
	public void Intercept(IInvocation invocation)
	{
		Console.WriteLine($"拦截器前{invocation.Method.Name}");
		invocation.Processed();// 执行具体方法
		Console.WriteLine($"拦截器后{invocation.Method.Name}");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值