lms框架模組詳解

懶小蟲 發表於 2021-06-07

模組的定義

一般地,開發者如果想要在一個自定義的程式集(包)中註冊相關的服務,或者在應用初始化或停止時執行一段自定義的程式碼,那麼您可能需要將該程式集(包)定義為一個模組。

lms框架存在兩種型別的模組:

  1. 開發者通過繼承LmsModule就可以定義一個普通模組類;
  2. 也可以通過繼承StartUpModule定義一個服務註冊啟動模組類。

例如:


// 普通型別模組類
public class CustomHostModule : LmsModule
{
}

// 啟動模組類,只有該型別的模組才可以被允許在構建服務中被指定為啟動模組
[DependsOn(typeof(ZookeeperModule),
        typeof(DotNettyTcpModule),
        typeof(MessagePackModule),
        typeof(RpcProxyModule),
        typeof(TransactionTccModule),
        typeof(AutoMapperModule)
)]
public class NormHostModule : StartUpModule
{
}

::: tip

  1. 開發者想要執行一個模組,需要在微服務時指定該模組,或是通過DependsOn特性直接或是間接的依賴該模組。

  2. 只有啟動模組類才可以在服務服務註冊時指定該模組為註冊的啟動模組。
    :::

模組的依賴關係

lms框架的模組通過DependsOn特性指定模組的依賴關係,lms框架支援通過直接或是間接的依賴模組。例如: NormHostModule模組依賴了DotNettyTcpModule模組,DotNettyTcpModule模組依賴了RpcModule模組,微服務註冊時指定NormHostModule為啟動模組。那麼根據模組依賴關係,RpcModule模組會被應用載入,並先於DotNettyTcpModuleNormHostModule執行服務註冊方法和初始化方法。

開發者只需要通過DependsOn特性在類直接就可以指定該模組依賴的模組,在應用啟動過程中,會根據模組的依賴關係進行排序。並完成服務註冊方法和指定的初始化方法。

例如,NormHostModule的模組依賴關係如下所示:

    [DependsOn(typeof(ZookeeperModule),
        typeof(DotNettyTcpModule),
        typeof(MessagePackModule),
        typeof(RpcProxyModule),
        typeof(TransactionTccModule),
        typeof(AutoMapperModule)
    )]
    public class NormHostModule : StartUpModule
    {
    }

微服務註冊時指定啟動模組

在構建微服務時,需要指定啟動的模組。

例如:


private static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
            .RegisterLmsServices<NormHostModule>() //指定啟動的模組,lms框架約束了該模組型別必須為啟動模組類(StartUpModule)
        ;
}

一般地,開發者可以根據微服務型別選擇註冊lms框架預設的模組,lms框架提供如下三個服務啟動模組(NormHostModuleWebHostModuleWsHostModule),lms框架給定的預設啟動模組會幫使用者指定該型別的微服務應用需要依賴哪些模組。

開發者如果需要自定義模組,那麼,相應的,開發者需要在模組依賴關係中宣告依賴該模組。所以,一般地,如果您需要自定義模組,那麼相應的,您可能需要自定義服務註冊啟動模組。

您可以通過繼承StartUpModule或是繼承該lms框架提供的預設啟動服務模組(NormHostModuleWebHostModuleWsHostModule),定義您的啟動模組,並在您定義的啟動模組中依賴您的自定義模組。

例如:


[DependsOn(typeof(ZookeeperModule),
        typeof(DotNettyTcpModule),
        typeof(MessagePackModule),
        typeof(RpcProxyModule),
        typeof(TransactionTccModule),
        typeof(AutoMapperModule),
        typeof(CustomHostModule),
)]
public class CustomNormHostModule : StartUpModule
{
}

// 或是

[DependsOn(typeof(CustomHostModule)
)] // 模組的依賴關係也會被繼承
public class CustomNormHostModule : NormHostModule
{
}

使用ContainerBuilder 註冊服務

在定義的模組中,開發者可以通過重寫RegisterServices方法,通過ContainerBuilder物件進行服務註冊。

例如:

protected override void RegisterServices(ContainerBuilder builder)
{
    builder.RegisterType<MessagePackTransportMessageDecoder>().AsSelf().AsImplementedInterfaces().InstancePerDependency();
    builder.RegisterType<MessagePackTransportMessageEncoder>().AsSelf().AsImplementedInterfaces().InstancePerDependency();
}

應用初始化方法和停止方法

開發者可以通過重新自定義模組的Initialize方法在微服務應用啟動時執行該模組指定的程式碼,通過重寫Shutdown方法在應用停止時執行該模組指定的程式碼。

public virtual Task Initialize([NotNull]ApplicationContext applicationContext)
{
    // 微服務應用執行時,指定該端程式碼
    return Task.CompletedTask;
}

public virtual Task Shutdown([NotNull]ApplicationContext applicationContext)
{
    // 微服務應用停止時,指定該端程式碼
    return Task.CompletedTask;
}

開源地址與文件

github: https://github.com/liuhll/lms

gitee: https://gitee.com/liuhll2/lms

開發者文件: http://docs.lms-fk.com/

相關文章