.NET 6 Autofac範例

目的

批次註冊

建立新專案

設定新的專案

其他資訊

NuGet加入套件

新增類別檔

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

編輯Program.cs檔案

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

新增資料夾

新增類別檔

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

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

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

  • ITest.cs寫入程式

namespace AutoFacExample.Services.Interface {
  public interface ITest {
    public string GetName(string id);
  }
}
  • TestService.cs寫入程式 繼承介面後寫上與介面相同的方法

using AutoFacExample.Services.Interface;

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

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();
    }

新增測試用controller

  • 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);
    }
  }
}

執行結果

參考

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

範例檔

GitHub

Last updated