AutoFac的使用总结(未完)
作者:互联网
因为微软系都会内置许多现有技术(如依赖注入等),我也一直没有去学习第三方的,但是现在看来是有必要学习一下的。
1. 替换内置Ioc容器
引用Nuget AutoFac、Autofac.Extensions.DependencyInjection。
//Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(service => service.AddAutofac()) //替换内置Ioc
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
//Startup.cs
//添加ConfigureContainer方法
public void ConfigureContainer(ContainerBuilder builder)
{
//采用模块方式
builder.RegisterModule(new AutofacModule());
}
//新建AutofacModule.cs文件
public class AutofacModule : Module //“Module”引用至using Autofac
{
protected override void Load(ContainerBuilder builder)
{
//服务注入
}
}
2. 服务注入
//AutofacModule.cs
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ArticleService>().As<IArticleService>(); //默认使用多例
builder.RegisterType<ArticleService>().As<IArticleService>().SingleInstance(); //单例注册
builder.RegisterType<ArticleService>().As<IArticleService>().InstancePerLifetimeScope(); //作用域注册
//UsingConstructor注册指定参数的构造函数
//默认注册构造函数参数最多的一项
builder.RegisterType<ArticleService>().As<IArticleService>().UsingConstructor();
//在Resolve阶段进行实例化,所以为单例注册
var instance = new ArticleService();
builder.RegisterInstance(instance).As<IArticleService>().ExternallyOwned();
//lambda注册,实现复杂参数
//c.Resolve<>,取出已经注入到容器的类型作为参数
builder.Register(c => new CommonService(c.Resolve<IArticleService>)).As<ICommonService>();
//注册多个实现
builder.Register<ICommonService>((c, p) =>
{
var number = p.Named<string>("number");
if (number == "1")
{
return new CommonService();
}
else
{
return new CommonService1();
}
});
//使用多个实现的注册
var common = _common.Resolve<ICommonService>(new NamedParameter("number", 1));
}
标签:总结,AutoFac,Resolve,RegisterType,builder,AutofacModule,注册,使用,new 来源: https://www.cnblogs.com/ufo233/p/15866623.html