最近在公司有個緊急的需求要做,不過礙於有些其他組別的 Library 版本還沒升上去,只好先暫時用 .net framework 4.5.2 開發,所以我想說順便紀錄一下 4.5.2 專案如何導入 Autofac 以及如何 DI 使用 Nlog。
※聲明:由於微軟已正式宣布 .net framework 4.5.2 將於 2022 年 4 月 26 日終止支援,還沒升級的人要盡快喔~
終止支援相關資訊可參考以下文章:
[microsoft] 生命週期常見問題集 - .NET Framework
示範環境
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