用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();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM