iT邦幫忙

2022 iThome 鐵人賽

DAY 7
1

目的

每次都要在Program.cs一個一個註冊,想找個方式批測註冊,也不用怕忘記有沒有註冊的類別。

同步更新於個人部落格
Autofac範例

1.建立新專案

選擇ASP.NET Core Web API專案範本,並執行下一步
步驟1

2.設定新的專案

命名你的專案名稱,並選擇專案要存放的位置。
步驟2

3.其他資訊

直接進行下一步
步驟3

4.NuGet加入套件

步驟4

5.新增類別檔

新增之後需要來描述要批次注入的規則

  • 加入前
    步驟5-1
  • 加入後
    步驟5-2

並且繼承autofac的類別Module
步驟5-3

5.編輯Program.cs檔案

//初始化並建立一個實例
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
//註冊autofac這個容器
builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new AutofacModuleRegister()));

步驟5-1
有繼承autofac的類別Module
步驟5-2

6.新增資料夾

新增下圖兩個資料夾
步驟6

7.新增類別檔

此次的目的是要可以進行批次注入,所以檔名結尾都需要包含Service,做批次注入時可以辨識

  • 在Services資料夾底下加入類別檔案,名稱為TestService

步驟7-1

  • 在Interface資料夾底下加入介面檔案,名稱為ITest

步驟7-2

  • ITest.cs寫入程式
namespace AutoFacExample.Services.Interface {
  public interface ITest {
    public string GetName(string id);
  }
}

步驟7-3

  • TestService.cs寫入程式
    繼承介面後寫上與介面相同的方法
using AutoFacExample.Services.Interface;

namespace AutoFacExample.Services {
  public class TestService : ITest {
    public string GetName(string id) {
      return $"{id}:Bill";
    }
  }
}

步驟7-4

8.AutofacModuleRegister執行批次註冊

    protected override void Load(ContainerBuilder builder) {
    //RegisterAssemblyTypes => 註冊所有集合
    //Where(t => t.Name.EndsWith("Service")) => 找出所有Service結尾的檔案
    //AsImplementedInterfaces => 找到Service後註冊到其所繼承的介面 
      builder.RegisterAssemblyTypes(typeof(Program).Assembly)
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces();
    }

步驟8

9.新增測試用controller

步驟9-1
步驟9-2

  • TestController.cs寫入程式
using AutoFacExample.Services.Interface;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace AutoFacExample.Controllers {
  [Route("api/[controller]")]
  [ApiController]
  public class TestController : ControllerBase {
    //為隱私修飾詞並且唯讀
    private readonly ITest _test;
    //在建構子時注入需要使用的服務
    public TestController(ITest test) {
      _test = test;
    }
    [HttpGet("GetName")]
    public string Get(string id) { 
    //使用注入的服務
    return _test.GetName(id);
    }
  }
}

注入的服務都是使用介面,目的是之後方便抽換,才可以進行測試
命名原則都會加一個底線代表全域變數

步驟9-3

10.執行結果

最終確認程式是可執行,就沒有問題了。
步驟10-1

參考

.net6註冊autofac說明文件
參考文件
參考文件
參考文件

範例檔

GitHub


上一篇
[.net 6] BenchmarkDotNet範例
下一篇
[.net 6] Bogus範例
系列文
.net6套件入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言