用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();
        }
复制代码

 

 

3.环境:.net core3.1

Program:

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Startup增加ConfigureContainer方法:

复制代码
 //集成Autofac
public void ConfigureContainer(ContainerBuilder builder)
{
   //业务逻辑层所在程序集命名空间
   Assembly service = Assembly.Load("ProjectCompleteWorks.Services");
   //接口层所在程序集命名空间
   Assembly repository = Assembly.Load("ProjectCompleteWorks.IServices");
   //自动注入
   builder.RegisterAssemblyTypes(service, repository)
          .Where(t => t.Name.EndsWith("Service"))
          .AsImplementedInterfaces();
}
复制代码

 

posted @   阳光下的行者  阅读(1468)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示