net core 3.0 與Autofac


首先需要nuget引入包

using Autofac;
using Autofac.Extensions.DependencyInjection;

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;           
        }

        public IConfiguration Configuration { get; }
        public static IContainer AutofacContainer;

//定義autofac容器

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {           
            

            //注冊數據庫Gwglxs
            services.AddDbContext<GwglxsDbContext>(options =>
                        options.UseSqlServer(
                            Configuration.GetConnectionString("GwglxsConnection")
                        )//.UseLazyLoadingProxies()//懶加載,需要加載包:Microsoft.EntityFrameworkCore.Proxies
                    );

            services.AddMvcCore()
                .AddAuthorization();//認證服務.AddJsonFormatters()               

            services.AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = "http://www.xxxx.com:5100";//授權服務器
                    options.RequireHttpsMetadata = false;

                    //options.Audience = "wyapicore";////"http://www.xxxx.cn:5211",//API數據提供中心
                    options.Audience = "wyapicore";////"http://www.xxxx.com:5211",//API數據提供中心
                });

            });

                        

            services.Replace(ServiceDescriptor
            .Transient<IControllerActivator, ServiceBasedControllerActivator>());//3.0

            //services.AddControllers();//3.0
            services.AddControllersWithViews().AddControllersAsServices();//3.0
            services.AddRazorPages();//3.0
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddMemoryCache();//使用本地緩存必須添加
            services.AddSession();//使用Session
           

            services.AddSignalR();//使用 SignalR
            //
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

            //add autofac
            ContainerBuilder containerbuilder = new ContainerBuilder();
            //將services中的服務填充到Autofac中
            containerbuilder.Populate(services);
            //型模塊組件注冊
            containerbuilder.RegisterModule<DefaultModuleRegister>();//<DefaultModuleRegister>();
            //創建容器
            AutofacContainer = containerbuilder.Build();
            //使用容器
            new AutofacServiceProvider(AutofacContainer);
        }

  //通過配置容器注冊接口類

        public void ConfigureContainer(ContainerBuilder builder)
        {
            builder.RegisterModule<DefaultModuleRegister>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHost host, Microsoft.Extensions.Hosting.IHostApplicationLifetime appLitetime)
        {
            //using (var container = host.Services.CreateScope())
            //{
            //    IPhone phone = container.ServiceProvider.GetService<IPhone>();
            //}

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();//????需要添加基礎標識數據庫架構之后才用與數據遷移
            }
            else
            {
                //app.UseExceptionHandler("/Home/Error");
                //the default hsts value is 30 days,you may want to change this for production scenarios,see https://aka.ms/aspnetcore-hsts.
                //app.UseHsts();

            }
            //app.UseHttpsRedirection();
            //app.UseSession();//app.UseSession();必須在app.UseHttpsRedirection();之后
            app.UseStaticFiles();
            app.UseCookiePolicy();           
            app.UseRouting();

            app.UseCors("default");//跨域管道
            //app.UseAuthentication();//認證管道
            app.UseAuthorization();//            

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();

                ////區域路由
                //endpoints.MapAreaControllerRoute(
                //    name: "areas",
                //    areaName:"areas",
                //    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
                //endpoints.MapRazorPages();
            });

            //程序停止調用autofac函數
            appLitetime.ApplicationStopped.Register(() => { AutofacContainer.Dispose(); });
        }       

    }

 

/////////////////////////下面是接口及類的注冊類////////////////////////////////

public class DefaultModuleRegister : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            ////注冊當前程序集中以“Service”及“Repository”結尾的類,暴漏類實現的所有接口,生命周期為PerLifetimeScope

    //以“Service”及“Repository”結尾的類是利用發型實現的數據倉庫的管理及業務處理的類和接口

            builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly()).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly()).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();

        }

        public static Assembly GetAssembly(string assemblyName)
        {
            var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(AppContext.BaseDirectory + $"{assemblyName}.dll");
            return assembly;
        }

    }


免責聲明!

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



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