NET Core 3.0 AutoFac替换内置DI的新姿势

原文:NET Core 3.0 AutoFac替换内置DI的新姿势

  .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题。

  原来在NET Core 2.1时候,AutoFac返回一个 IServiceProvider 参数注入到ConfigureServices .NET Core 服务中,基本大痣是这样做的。

  首先我们需要一个重写 Autofac.Module 的方法,这将用于将我们 Register [数据访问层] 以及  Services [逻辑层] 的注册。

public class AutofacModuleRegister : Autofac.Module
    {
        //重写Autofac管道Load方法,在这里注册注入
        protected override void Load(ContainerBuilder builder)
        {
            //必须是Service结束的
            builder.RegisterAssemblyTypes(GetAssemblyByName("BlogService")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
            builder.RegisterAssemblyTypes(GetAssemblyByName("BlogRepository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();
            //单一注册
            //  builder.RegisterType<PersonService>().Named<IPersonService>(typeof(PersonService).Name);
        }
        /// <summary>
        /// 根据程序集名称获取程序集
        /// </summary>
        /// <param name="AssemblyName">程序集名称</param>
        public static Assembly GetAssemblyByName(String AssemblyName)
        {
            return Assembly.Load(AssemblyName);
        }
    }

  随后,将.NET Core的ConfigureServices方法的返回值改成IServiceProvider,这将用于注入你的服务。

 public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            return Blog.AutoFacModule.Solucation.AutoFac.Provider.RegisterAutofac.ForRegisterAutofac(services);
        }

  上面的代码中我们调用了 ForRegisterAutoFac 我们自定义的方法,这将我们定义的策略和AutoFac 一起替换内置DI.

public static class RegisterAutofac
    {
        public static IServiceProvider ForRegisterAutofac(IServiceCollection services)
        {
            var builder = new ContainerBuilder();
            builder.Populate(services);
            builder.RegisterModule<Blog.AutoFacModule.Solucation.AutoFac.Register.AutofacModuleRegister>();
            var container = builder.Build();
            return new AutofacServiceProvider(container);
        }
    }

  在API层,我们依赖注入Service,这样我们.NET Core2.1基本的AutoFac就实现了。

[Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private IPersonService _personService;
        public ValuesController(IPersonService personService)
        {
            _personService = personService;
        }
        // GET api/values
        [HttpGet]
        public ActionResult<string> Get()
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(_personService.people());
        }}

  就现在我们说一说.NET Core3.0 和 以往版本的区别。我将所有项目以及依赖项全部改成3.0版本,就现在启动,你会发现意想不到的事情。

啥?你说啥?弄萨累? 咋不管用了嘞?

  经过看了官方文档,才知道..NET Core 3.0 引入了具有强类型容器配置的功能。它提供了 ConfigureContainer 方法,您可以在其中使用Autofac来注册事物,而不必通过 ServiceCollection 来注册事物。so....好吧!在.NET Core3.0 将如何配置。

  首先我们需要在 Program.cs 中修改服务工厂,内置是 ServiceProviderFactory 的,我们将要指定为: AutofacServiceProviderFactory 。

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

  现在需要在 Startup.cs 中添加方法 ConfigureContainer ,并添加以下代码。

public void ConfigureContainer(ContainerBuilder builder)
        {
            //添加依赖注入关系
            builder.RegisterModule(new Blog.AutoFacModule.Solucation.AutoFac.Register.AutofacModuleRegister());
            var controllerBaseType = typeof(ControllerBase);
            //在控制器中使用依赖注入
            builder.RegisterAssemblyTypes(typeof(Program).Assembly)
                .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
                .PropertiesAutowired();
        }

然后大功告成,启动再也没问题了~。

Github地址:https://github.com/zaranetCore/Blog.DDD.Solucation

原文地址:https://www.cnblogs.com/lonelyxmas/p/12052138.html

时间: 2024-11-05 18:45:32

NET Core 3.0 AutoFac替换内置DI的新姿势的相关文章

ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

原文:ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用) 在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. PS:本章将主要采用构造函数注入的方式,下一章将继续分享如何使之能够同时支持属性注入的方式. 约定: 1.仓储层接口都以“I”开头,以“Repos

ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替换自带DI进行构造函数的批量依赖注入,本章将和大家继续分享如何使之能够同时支持属性的批量依赖注入. 约定: 1.仓储层接口都以“I”开头,以“Repository”结尾.仓储层实现都以“Repository”结尾. 2.服务层接口都以“I”开头,以“Service”结尾.服务层实现都以“Service”结尾. 接下来我们正式进入主题,在上一章的基础上我们再添加一个web项目TianYa.DotNetShare.Core

[Learn AF3] App Framework 3.0中的内置矢量图标

AF3的内置矢量图标 介绍:要使用af3中的图标,必须首先引入icon.css,由于文件中已经内置了字体文件数据,因此不需要引入字体文件支持. <link rel="stylesheet" type="text/css" href="js/af3.0/icons.min.css" /> 使用:引入icon.css文件之后,我们就可以通过给需要显示图标的元素添加css类名来显示图标(实际上就是一个矢量字符),注意需要同时添加icon 和

velocity.ui2.0所有的内置动画名称

velocity升级到2.0后api发生了变化,按照原来的名称已经不能调用原来的动画效果,新的名称如下:velocity.ui2.0所有的内置动画名称 bounce flash headShake jello pulse rubberBand shake swing tada wobble bounceIn bounceInDown bounceInLeft bounceInRight bounceInUp bounceOut bounceOutDown bounceOutLeft bounce

ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET Core提供了内置的日志,但没弄明白这么把它输出到文件, 只能在VS的输出中查看, 谁知道怎么弄告诉我一下.(ASP.NET Core 系列目录) 本例 GitHub 一.内置日志的使用 上一篇:如何在后台运行一个任务  中使用到了内置的日志,直接在构造中注入一下,然后直接使用即可, 非常方便 pu

ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用

1.Autofac基础使用 参考: https://www.cnblogs.com/li150dan/p/10071079.html 2.ASP.NETCore 3.0 Autofac 容器替换 需要引用:Autofac, Autofac.Extensions.DependencyInjection 在Program.cs 使用AutofacServiceProviderFactory进行容器替换. public static IHostBuilder CreateHostBuilder(str

ThinkPHP5.0 模板输出内置标签

一.VOLIST标签 1.循环遍历输出(如果没有指定key属性的话,默认使用循环变量i) {volist name="list" id="vo" key="k" } {$k}.{$vo.name} {/volist} 2.取模 //输出5~10行 {volist name="list" id="vo" offset="5" length='10'} {$vo.name} {/volist

内网劫持渗透新姿势:MITMf简要指南

声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:"长得丑就要多读书!"于是有了这篇文章. 0×02 简要介绍 这篇文章的主要目的是介绍一下一个最新的中间人攻击测试框架 – MITMf.工具的作者是byt3bl33d3r,是基于代理工具sergio-proxy修改而来.这里是工具的地址: https://github.com/byt3bl3

ASP.NET Core 1.0 中使用Log日志

https://github.com/aspnet/Logging https://docs.asp.net/en/latest/fundamentals/logging.html ASP.NET Core 1.0提供了内置的日志模块,当然也可以使用自己喜爱日志框架. Providers Community projects adapt Microsoft.Extensions.Logging for use with different back-ends. Serilog - provide