iT邦幫忙

2022 iThome 鐵人賽

DAY 28
1
自我挑戰組

[Dot Net Core](圖解系列與常用套件)系列 第 28

[Dot Net Core](常用套件) 28. 抽換類別模組不重啟服務 - 使用Autofac協助研究範例

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220928/201446149GvlSvUVKi.jpg

有時會思考一個問題,因為系統的複雜度上升,往往變更後更版上線也跟著複雜起來。那如果是微服務呢? 中斷了系統使用外,也要更新好幾個POD。
有沒有一條路是可以擴充需求或模組,但不重啟HOST? 如果微服務中不需重新 dock build image,直接替換或擴充模組?

可以先由讀取 DLL 到 .Net Core 並 IOC 到專案中來試試(搭配 Autofac)。

首先準備好共同介面專案,其介面為:

namespace CommonInterface
{
    public interface ITostring 
    {
        string toString();

    }
}

接著準備好外部要替換的專案(MyDLL4),其中的類別:

namespace MyDLL4
{
    public class DemoFinal : CommonInterface.ITostring
    {
        public string toString()
        {
            return "this is MyDLL4-Final toString Method!";
        }
    }
}

於 .NET Core 專案,註冊方式使用 Autofac.Module ,可參考"Autofac 如何替代 Dot Net Core 的原生DI機制"。 程式碼如下:

var json = LoadJson();
dynamic jsonObj = JsonConvert.DeserializeObject(json);
Type newType = ReflectTool.GetTypeByLoadDLL(jsonObj.DLLPath.ToString() , jsonObj.DLLModule.ToString() );
builder.RegisterType(newType).As<CommonInterface.ITostring>();

接著讀取 json 設定檔案,設定檔案內容為:

{
  "DLLPath": "D:\\MyDLL4\\MyDLL4\\bin\\Debug\\MyDLL4.dll",
  "DLLModule": "MyDLL4.DemoFinal"
}

以 "DLLPath" 指定好路徑, 以 "DLLModule" 指定模組名稱。

var json = LoadJson(); 則是將此當案內容讀入,並指定到 變數 jsonObj。 讀取到指定路徑的DLL後,將模組的 Type 資訊擷取出來,
再利用 Autofac 的 ContainerBuilder.RegisterType 來註冊此 Type 。

執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20220928/20144614qIibdGrhJp.jpg

可抽換類別內容不重啟,另外思考一下,能否擴充 API method 或 Controller Method 而不重啟 host? 研究以下範例:

首先準備好共同 BaseController :

namespace CommonBaseController
{
    public  abstract class BaseController : Controller
    {

        abstract public JsonResult GetJson();

    }
}

接著準備好要替換的外部 Controller :

namespace ExtendControllerDLL
{
    public partial class ExtendController : CommonBaseController.BaseController
    {
        public override JsonResult  GetJson()
        {
            return Json(new { id = "999", name = "czxdas" });
        }
    }
}

於 .NET Core 專案,註冊方式使用 Autofac.Module :

Type myTypeController =
ReflectTool.GetTypeByLoadDLL(
@"D:\ExtendControllerDLL\ExtendControllerDLL\bin\Debug\ExtendControllerDLL.dll",
"ExtendControllerDLL.ExtendController"
 );

builder.RegisterType(myTypeController).As<CommonBaseController.BaseController>();

執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20220928/20144614z247Bc61aW.jpg

似乎可以達成不重啟而替換模組,供未來一種替換方式參考。


上一篇
[Dot Net Core](常用套件) 27. 批次註冊至 IOC Container - Scrutor vs Autofac
下一篇
[Dot Net Core](常用套件) 29. 外部擴充功能研究範例
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言