用Autofac替换.net core 内置容器
之前看过一个帖子,他用的.net core2.2给出两种方法,我整理到了下边,自己写了一下,发现两种写法在.net core 3.0中都不支持,然后查了一些资料在最下边整理出来3.0的写法 欢迎学习交流
1.环境: .net core 2.2
nuget 安装:
Autofac Autofac.Extensions.DependencyInjection
第一种方法:
新建类:AutofacModule
using Autofac; using IService2; using Service2; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebApplication2 { public class AutofacModule: Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<UserInfoService>().As<IUserInfoService>(); builder.RegisterType<TestService>().As<ITestService>(); } } }
Startup类中: 返回 IServiceProvider
public IServiceProvider ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); // Add Autofac 第一种方式,使用AutofacModule配置文件 var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterModule<AutofacModule>(); containerBuilder.Populate(services); var container = containerBuilder.Build(); return new AutofacServiceProvider(container); }
第二种方法:
public IServiceProvider ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);// Add Autofac 第二种方式 自动注册该程序集下的所有接口 var containerBuilder = new ContainerBuilder(); //自动注册该程序集下的所有接口 //Service2 为程序集命名空间 服务层非接口层 //InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 //SingleInstance:单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象; //InstancePerDependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象; containerBuilder.RegisterAssemblyTypes(Assembly.Load("Service2")).AsImplementedInterfaces().InstancePerLifetimeScope(); containerBuilder.Populate(services); var container = containerBuilder.Build(); return new AutofacServiceProvider(container); }
2.环境: .net core 3.0 preview5
nuget 安装:
Autofac Autofac.Extensions.DependencyInjection
Program类中
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) //Wire up autofac .UseServiceProviderFactory(new AutofacServiceProviderFactory()); }
Startup类中
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; }); services.AddControllersWithViews() .AddNewtonsoftJson(); services.AddRazorPages(); } public void ConfigureContainer(ContainerBuilder containerBuilder) { //wire up using autofac specific APIs here containerBuilder.RegisterType<UserInfoService>().As<IUserInfoService>().InstancePerLifetimeScope(); containerBuilder.RegisterType<TestService>().As<ITestService>().InstancePerLifetimeScope(); }