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

 更新时间:2019年09月30日 08:27:30   作者:ZaraNet   我要评论

这篇文章主要给大家介绍了关于NET Core 3.0 AutoFac内置DI替换的新姿势,文中通过示例代码介绍的非常详细,对大家学习或者使用NET Core 3.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

.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

总结

以上就是我在处理客户端真实IP的方法,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • ASP.NET中用js取CheckBoxList中值的方法实例

    ASP.NET中用js取CheckBoxList中值的方法实例

    用脚本取CheckBoxList中的值,并用"|"将其分开,之后将取到的值放入文本框,返回数据库做添加或者修改
    2013-07-07
  • 在ASP.NET Core中显示自定义的错误页面

    在ASP.NET Core中显示自定义的错误页面

    大家在用浏览器访问服务器时,不同情况下会返回不同的信息。服务器发生错误就会返回错误信息,我们最熟悉的就是404错误页面,但是这里我想和大家分享下在ASP.NET Core中如何显示自定义的500或404错误页面,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • c#生成缩略图不失真的方法实例分享

    c#生成缩略图不失真的方法实例分享

    使用.net的方法GetThumbnailImage生成的缩略图失真严重,这里推荐一种不失真生成缩略图的方法
    2013-12-12
  • VS+opencv实现鼠标移动图片

    VS+opencv实现鼠标移动图片

    这篇文章主要为大家详细介绍了VS+opencv实现鼠标移动图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • asp.net gridview代码绑定

    asp.net gridview代码绑定

    昨天试过了传统的数据连接方式和数据显示,但代码看起来总有点ASP的痕迹,今天就试试ASP.net服务器控件gridview的数据绑定!
    2008-10-10
  • Asp.Net使用Bulk实现批量插入数据

    Asp.Net使用Bulk实现批量插入数据

    这篇文章主要介绍了Asp.Net使用Bulk实现批量插入数据的方法,对于进行asp.net数据库程序设计非常有借鉴价值,需要的朋友可以参考下
    2014-09-09
  • ASP.NET MVC HtmlHelper如何扩展

    ASP.NET MVC HtmlHelper如何扩展

    ASP.NET MVC 中HtmlHelper方法为我们提供很多html标签,只需在页面调用就行了,但是微软并没有把所有的html标签都对应有了扩展方法,需要我们自定义HtmlHelper,来满足我们需要。
    2016-05-05
  • ASP.NET MVC中异常处理&自定义错误页详析

    ASP.NET MVC中异常处理&自定义错误页详析

    当ASP.NET MVC程序出现了异常,怎么处理更加规范?下面这篇文章主要给大家介绍了关于ASP.NET MVC中异常处理&自定义错误页的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2018-04-04
  • jquery repeater 模仿 Google 展开页面预览子视图

    jquery repeater 模仿 Google 展开页面预览子视图

    节后的这一周, 希望大家能挺住, hehe, 这两天给大家准备一个 Repeater 子视图的例子, 模拟了 Google 搜索结果后的页面的预览, 其实也只是显示了一段问题
    2011-10-10
  • asp.net中通过DropDownList的值去控制TextBox是否可编写的实现代码

    asp.net中通过DropDownList的值去控制TextBox是否可编写的实现代

    Web窗体上有两控件,DropDownList1,TextBox1,当DropDownList的值选择是YES的时候,TextBox1可编辑,当选择NO的时候,TextBox1的值为空,并且不能编辑,该如何实现
    2012-11-11

最新评论