public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ITestService1, TestService1>();//瞬时
services.AddScoped<ITestService2, TestService2>();//作用域
services.AddSingleton<ITestService3, TestService3>();//单例
}
public class HomeController : Controller
{
private readonly ITestService1 _testService1;
private readonly ITestService2 _testService2;
private readonly ITestService3 _testService3;
public HomeController(ITestService1 testService1, ITestService2 testService2, ITestService3 testService3)
{
_testService1 = testService1;
_testService2 = testService2;
_testService3 = testService3;
}
}
Program
,增加UseServiceProviderFactory(new AutofacServiceProviderFactory())
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
//改用Autofac来实现依赖注入
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Startup
: public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(o => o.EnableEndpointRouting = false);
//注册服务(注册依赖)
services.AddTransient<Interface1, TestService1>();//瞬时
services.AddSingleton<Interface2, TestService2>();//单例
services.AddScoped<Interface3, TestService3>();//作用域
}
第4步,注册服务,还有另一种处理方式,即把注册服务独立出来:
//注册服务独立出来,新增一个类,继承 Autofac.Module
public class CustomAutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
//注册服务
builder.RegisterType(typeof(Service1)).As<Interface1>().SingleInstance();//单例
builder.RegisterType(typeof(Service2)).As<Interface2>().InstancePerLifetimeScope();//线程独立
builder.RegisterType(typeof(Service3)).As<Interface3>().InstancePerDependency();//瞬时,为每个依赖或者调用(Resolve())都创建一个新的对象
}
}
在Startup
里就不用注册服务了,在ConfigureServices
下面,新增一个ConfigureContainer
方法
// 注册服务独立出来
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new CustomAutofacModule());
}
public class HomeController : Controller
{
private readonly Interface1 _Service1;
private readonly Interface2 _Service2;
private readonly Interface3 _Service3;
public HomeController(Interface1 s1, Interface2 s2, Interface3 s3)
{
//依赖注入
_Service1 = s1;
_Service2 = s2;
_Service3 = s3;
}
public IActionResult Index()
{
_Service1.Show();
_Service2.Show();
_Service3.Show();
return View();
}
}
//批量注册
public class AutofacModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
string basePath = AppContext.BaseDirectory;
var assembly = Assembly.LoadFrom(Path.Combine(basePath, "AspNetCore.Service.dll"));
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
}
}
builder.RegisterType().AsImplementedInterfaces();
,以接口方式进行注入,使用时用IA,会返回一个A的实例,即将自身的实例进行注入;builder.RegisterType().AsImplementedInterfaces().InstancePerRequest() ;
每次请求共享同一个实例,使用ef时,使不同的操作使用同一个数据上下文;builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
注册了当前程序集内的所有的类;InstancePerHttpRequest
在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发参考文档:ASP.NET Core依赖注入&AutoFac
Autofac在ASP.Net Core3.0配置
.net core2.1 三层中使用Autofac代替原来Ioc
关于依赖注入autofac的相关知识