Loading

NET Core 3.0 项目中使用 AutoFac

.net core 3.1 今天已正式发布,3.1跟3.0差别不是很大,主要是对 3.0一小部分修复和完善,最重要的是.NET Core 3.1是长期支持(LTS)版本,建议大家升级。

.net core 2.2 这个月就要停止维护,并且微软将不再提供支持,如果你在使用 2.2 ,建议升级到 3.1,可以先升级到3.0,可以参考文档:

ASP.NET Core 2.2 迁移到3.0:https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio

如果在使用 2.1,可以暂时不用着急升级,2.1也是 LTS 版本

ASP.NET Core 3.0的新增功能:https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.0?view=aspnetcore-3.0

替换AutoFac服务

在 .Net Core 3.0 之前的时候,返回一个 IServiceProvider 注入到ConfigureServices服务中。

用 .Net Core 3.0 框架运行之后会报错:ConfigureServices returning an System.IServiceProvider isn't supported.

找文档之后发现 3.0 中 ConfigureServices 已经不支持返回 IServiceProvider 。

.Net Core 2.2的写法

        /// <summary>
        /// //负责注入服务
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            //初始化容器
            var builder = new ContainerBuilder();
            //管道寄居
            builder.Populate(services);
            //业务逻辑层所在程序集命名空间
            Assembly service = Assembly.Load("NetCoreDemo.Service");
            //接口层所在程序集命名空间
            Assembly repository = Assembly.Load("NetCoreDemo.Repository");
            //自动注入
            builder.RegisterAssemblyTypes(service, repository)
                .Where(t => t.Name.EndsWith("Service"))
                .AsImplementedInterfaces();
            //注册仓储,所有IRepository接口到Repository的映射
            builder.RegisterGeneric(typeof(Repository<>))
                //InstancePerDependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;
                .As(typeof(IRepository<>)).InstancePerDependency();
            //构造
            ApplicationContainer = builder.Build();
            //将AutoFac反馈到管道中
            return new AutofacServiceProvider(ApplicationContainer);
        }

.Net Core 3.0的写法

修改 Program.cs 将默认ServiceProviderFactory指定为AutofacServiceProviderFactory

    public class Program
    {
        public static void Main(string[] args)
        { 
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                 //将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseUrls("http://*:8004");
                });
    }

然后在 Startup.cs 中添加 ConfigureContainer 方法

使用ConfigureContainer访问Autofac容器生成器,并直接向Autofac注册。

        public void ConfigureContainer(ContainerBuilder builder)
        {
            //业务逻辑层所在程序集命名空间
            Assembly service = Assembly.Load("NetCoreDemo.Service");
            //接口层所在程序集命名空间
            Assembly repository = Assembly.Load("NetCoreDemo.Repository");
            //自动注入
            builder.RegisterAssemblyTypes(service, repository)
                .Where(t => t.Name.EndsWith("Service"))
                .AsImplementedInterfaces();
            //注册仓储,所有IRepository接口到Repository的映射
            builder.RegisterGeneric(typeof(Repository<>))
                //InstancePerDependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;
                .As(typeof(IRepository<>)).InstancePerDependency();
        }

参考:https://docs.autofac.org/en/latest/integration/aspnetcore.html#asp-net-core-3-0-and-generic-hosting

posted @ 2019-12-04 22:51  tenghao510  阅读(4147)  评论(10编辑  收藏  举报