Web API Restful API .Net Core Asp.Net Core Autofac DI Dependency injection

.Net Core 模組化相依注入

Rex 2019/10/16 16:34:03
112

一、 前言

Autofac是一款適用於 .NET Framework .NET CoreIoC容器 。它可以管理類之間的相依關係從而使應用在大型專案及復雜性擴充的情況下依然可以輕易地修改。通過將常規 .NET類別當做組件處理實作。

這邊將使用 ASP.NET Core Web API 專案實作。

 

二、 ASP.NET Core 使用 Autofac

首先使用 Nuget 安裝 Autofac.Extensions.DependencyInjection 套件,目前最新版本為 v5.0.1

 

安裝完成後會自動相依所需要的套件。

 

[Program.cs]

安裝完成之後,在 Host 加入 Autofac.Extensions.DependencyInjection 命名空間及 Autofac 擴充功能 (AddAutofac)

using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
 
namespace ModuleDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
 
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

 

 [Startup.cs]

加入 Autofac 命名空間,並且新增實作 ConfigureContainer 抽象介面。

using Autofac;

 

新增完成後實作方法 ContainerBuilder.RegisterModel ,並且新增一個 AutofacModule 類別 (AutofacModule.cs)

public void ConfigureContainer(ContainerBuilder builder)
{
    builder.RegisterModule(new AutofacModule());
}

 

[AutofacModule.cs]

加入 Autofac 命名空間,並且讓 AutofacModule 類別繼承 Autofac.Module 類別,並且複寫 Autofac.Module.Load 虛擬方法。

Autofac.Module.Load 方法中註冊 Components 並且告訴容器哪些 Components暴露了哪些Service
註冊相關資訊可以參考 https://autofaccn.readthedocs.io/en/latest/register/registration.html

public class AutofacModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ConsoleLog>().As<ILog>();
    }
}
 
public interface ILog
{
    void Print(string message);
}
 
public class ConsoleLog : ILog
{
    public void Print(string message)
    {
        Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-H:mm:ss.fff")}] [Log] :{message}");
    }
}

 

執行專案後,在命令提示字元視窗中,看到了 ConsoleLog 類別的輸出內容。

 

Rex