[ASP.NET] .net framework 4.5.2 使用 Autofac & Nlog

最近在公司有個緊急的需求要做,不過礙於有些其他組別的 Library 版本還沒升上去,只好先暫時用 .net framework 4.5.2 開發,所以我想說順便紀錄一下 4.5.2 專案如何導入 Autofac 以及如何 DI 使用 Nlog。

 

※聲明:由於微軟已正式宣布 .net framework 4.5.2 將於 2022 年 4 月 26 日終止支援,還沒升級的人要盡快喔~

終止支援相關資訊可參考以下文章:

[microsoft] 生命週期常見問題集 - .NET Framework

[黑暗執行緒] .NET Framework 技術支援終止期限(EOS)整理

[黑暗執行緒] 蛤,微軟停止.NET 4.0/4.5/4.5.1的技術支援?會對我的系統造成影響嗎?

 

 

 

示範環境

TargetFramework:.net framework 4.5.2

專案類型:Web API

Autofac version:4.9.2

NLog version:4.7.14

 

 


Create Net framework 專案

 

.net framework 最先選擇的專案範本沒有那麼多個,開發 Web API 的話選擇這個就好。

 

設完名稱、選擇完 target framework 後才會再選擇更詳細的範本內容

 

這裡為了示範方便,我就直接選擇 Web API 了,他會預設幫你建好一些範例內容,包含預設起始頁面、預設幾個 RESTful API。

 

我 Create 一個簡易的 Library 專案,裡面簡單 return 一個 Value List,供 API 專案使用。

 

 


導入 Autofac

 

安裝這 2 個 NuGet 套件,由於此專案是 .net framework 4.5.2 ,所以這裡使用的 Autofac 最高只能安裝以下版本 

Install-package Autofac  -Version 4.9.2

Install-package Autofac.WebApi2  -Version 4.3.1

 

在 App_Start 目錄下新增一個名為 AutofacConfig.cs 的配置檔

public class AutofacConfig
    {
        public static IContainer Container;

        public static void Initialize(HttpConfiguration config)
        {
            Initialize(config, RegisterServices(new ContainerBuilder()));
        }

        public static void Initialize(HttpConfiguration config, IContainer container)
        {
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }

        private static IContainer RegisterServices(ContainerBuilder builder)
        {
            //取得目前正在執行之程式碼的組件
            Assembly assembly = Assembly.GetExecutingAssembly();

            //註冊 API controller
            builder.RegisterApiControllers(assembly);

            //註冊 HttpContext
            builder.Register(c => new HttpContextWrapper(HttpContext.Current))
                .As<HttpContextBase>()
                .InstancePerRequest();

            //註冊此方案內的其他專案 dll
            var libraryAssemblies = Directory.EnumerateFiles(
                    AppDomain.CurrentDomain.BaseDirectory, @"Net452*.dll",
                    SearchOption.AllDirectories)
                .Select(Assembly.LoadFrom);

            builder.RegisterAssemblyTypes(libraryAssemblies.ToArray())
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            //建立 Container
            Container = builder.Build();

            return Container;
        }
    }

 

在 Global.asax 中配置 AutofacConfig

AutofacConfig.Initialize(GlobalConfiguration.Configuration);

 

這樣就完成 Autofac 的設置了。

即可在 Controller 透過建構函式注入 Library 中的 Service。

 

 


導入 Nlog

 

 [ 基本使用方式 ]

 

安裝以下 2 個 NuGet 套件 

Install-package NLog  -Version 4.7.14

Install-package NLog.Config  -Version 4.7.14

NLog.Config 套件可以幫你自動添加 NLog.config 設定檔,沒有非要安裝不可,你也可以自己手動加。

 

NLog.config 放置在專案根目錄最外層

 

於 NLog.config 配置 Log file 匯出的格式 & 內容

由 NLog.Config 套件產生的設定檔,他會註解一些範例說明,這裡做為示範我就直接拿範例用了。

 

在 code 裡面 using NLog 並實例化 Logger

private static Logger logger = LogManager.GetCurrentClassLogger();

 

即可開始記錄各種級別的 Log

 

印出來的 Log 長這樣

 

以上是 NLog 在 .net framework 的基本使用方式,不過這樣需要每個使用的類別中都要創建實例,每個使用的專案也都要各自安裝一遍 Nlog,這種做法沒那麼好,所以接下來我要改成用 DI使用。

 

 

[ Autofac 注入 NLog 方式 ]

 

在 API 專案安裝這 2 個 NuGet 套件 

Install-package Utility.Logging

Install-package Utility.Logging.NLog.Autofac

 

之所以需要另外安裝這些 NuGet 套件,是因為在 .net framework 中並不像 .NET Core 有自動注冊 Logger,所以需要另外安裝來達成同樣的目的。

這裡使用 Utility.Logging 這個套件,他提供了 NLog 與 Autofac 的整合,並且也有提供 ILogger 介面,可以不用自己刻。

 

安裝好套件後,在 AutofacConfig.cs 中註冊 NLog,就完成了。

builder.RegisterModule(new NLogLoggerAutofacModule());

 

即可在 Controller 透過建構函式注入 ILogger,不用再寫 LogManager.GetCurrentClassLogger()。

using Utility.Logging;

 

當其他相依的 Library 專案也需要紀錄 Log 時,也只需要安裝 Utility.Logging 即可(不用再裝 Nlog),注入方式相同,End。

 

 

 

以上範例的 Source Code:[GitHub] KittyChen913 - Net452AutofacDemo