AutoFac的使用总结
因为微软系都会内置许多现有技术(如依赖注入等),我也一直没有去学习第三方的,但是现在看来是有必要学习一下的。
1. 替换内置Ioc容器
引用Nuget AutoFac、Autofac.Extensions.DependencyInjection。
//Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(service => service.AddAutofac()) //替换内置Ioc core3.0之前的版本
//.UseServiceProviderFactory(new AutofacServiceProviderFactory()) 替换内置Ioc core3.0之后的版本,参考1中有解释
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});
//Startup.cs
//添加ConfigureContainer方法
public void ConfigureContainer(ContainerBuilder builder)
{
//采用模块方式
builder.RegisterModule(new AutofacModule());
}
//新建AutofacModule.cs文件
//“Module”引用至using Autofac
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
//服务注入
}
}
2. 服务注入
//AutofacModule.cs
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType().As(); //默认使用多例
builder.RegisterType().As().SingleInstance(); //单例注册
builder.RegisterType().As().InstancePerLifetimeScope(); //作用域注册
//UsingConstructor注册指定参数的构造函数
//默认注册构造函数参数最多的一项
builder.RegisterType().As().UsingConstructor();
//在Resolve阶段进行实例化,所以为单例注册
var instance = new ArticleService();
builder.RegisterInstance(instance).As().ExternallyOwned();
//lambda注册,实现复杂参数
//c.Resolve<>,取出已经注入到容器的类型作为参数
builder.Register(c => new CommonService(c.Resolve)).As();
//注册多个实现
builder.Register((c, p) =>
{
var number = p.Named("number");
if (number == "1")
{
return new CommonService();
}
else
{
return new CommonService1();
}
});
//使用多个实现的注册
var common = _common.Resolve(new NamedParameter("number", 1));
//反射服务注册
Assembly assembly = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.EndsWith("Impl")).AsImplementedInterfaces();
}
3. 扩展
https://blog.csdn.net/wulex/article/details/78664612
4. 参考
(1)