前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Autofac在.NET Core 中的使用

Autofac在.NET Core 中的使用

作者头像
心莱科技雪雁
发布2020-05-11 11:26:24
1.8K0
发布2020-05-11 11:26:24
举报
文章被收录于专栏:雪雁的专栏

前言

Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使应用在规模及复杂性增长的情况下依然可以轻易地修改 。.NET CORE 中也内置了依赖注入,但是有些情况下需要用到Autofac去进行依赖注入,Autofac支持的所有注入方式以外,还支持属性注入和方法注入。接下来我们通过示例来简单了解Autofac的使用

示例

新建两个.NET CORE 项目,一个WEB层,一个服务层

服务层中添加几个测试服务和模块文件

服务代码都如图所示

引入Autofac Nuget包文件

NetCoreAutofacServiceModule 类继承Autofac.Module,并重写Autofac管道中的Load方法,如下图多种方式注入服务。

接下来就是在WEB层配置Autofac,这里需要注意的是.Net Core2+ 和 .Net Core3+ 的配置方法稍有不同

.NET CORE 2+

在NET Core 2.1时候,AutoFac返回一个 IServiceProvider 参数注入到ConfigureServices .NET Core 服务中,写法如下:

代码语言:javascript
复制
public IServiceProvider ConfigureServices(IServiceCollection services)
{
   services.AddControllers();
   return AutofacProvider.RegisterForNetCore2(services);
}

代码语言:javascript
复制
//将定义的策略和AutoFac 一起替换内置DI
public static IServiceProvider RegisterForNetCore2(IServiceCollection services) {
   var builder = new ContainerBuilder();
   builder.Populate(services);
   //按模块注入服务
   builder.RegisterModule<NetCoreAutofacServiceModule>();
   var Container = builder.Build();
   return new AutofacServiceProvider(Container);
}

.NET CORE 3+

在.NET Core3.0 使用上面的写法,框架运行之后会报错:

ConfigureServices returning an System.IServiceProvider isn't supported.

.NET Core 3.0 引入了具有强类型容器配置的功能。它提供了 ConfigureContainer 方法,可以在其中使用Autofac来注册事物,而不必通过 ServiceCollection 来注册事物。首先需要在 Program.cs 中修改服务工厂,内置是 ServiceProviderFactory 的,修改指定为:AutofacServiceProviderFactory 。

代码语言:javascript
复制
public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>
      {
           webBuilder.UseStartup<Startup>();
      })
  .UseServiceProviderFactory(new AutofacServiceProviderFactory());

 然后在 Startup.cs 中添加方法 ConfigureContainer ,并配置Autofac策略

代码语言:javascript
复制
public void ConfigureContainer(ContainerBuilder builder)
{
    AutofacProvider.RegisterForNetCore3(builder);
}

代码语言:javascript
复制
public static void RegisterForNetCore3(ContainerBuilder builder)
{
   builder.RegisterModule<NetCoreAutofacServiceModule>();
}

最后在控制器中依赖注入服务,可以在方法上用[FromServices]注入,也可以通过构造函数注入

代码语言:javascript
复制
[HttpGet]
[Route("GetName")]
public string GetName([FromServices] IThreeRepository threeRepository,
  [FromServices] IOneService oneService,
  [FromServices] ITwoService twoService)
{
   return $"【threeRepository】 : {threeRepository.GetName()}; 【oneService】 : {oneService.GetName()} ; 【twoService】 : {twoService.GetName()}";
}

启动服务看看结果

服务已经注册成功ThreeRepository 与 IThreeRepository 通过 RegisterType 方法注册;

代码语言:javascript
复制
builder.RegisterType<ThreeRepository>().AsImplementedInterfaces();

OneService、IOneService、TwoService、ITwoService 则是通过RegisterAssemblyTypes方式注册;

代码语言:javascript
复制
builder.RegisterAssemblyTypes(typeof(NetCoreAutofacServiceModule).Assembly).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 麦扣聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 示例
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档