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}");
}
}