0%

[DotnetCore]泛型運用系列-注入篇

前提情要

前提情要請參考[DotnetCore]泛型運用系列-Model設計篇,不過筆者還是在這邊再列一下會用到的技術觀念與套件:

  • AutoMapper:運用於將檔案內容對應的物件轉成EFCore的物件時
  • Generic Class/Method: 不想寫多個Service去處理多個檔案,設計成泛型形式以符合各種檔案類型
  • Attribute: 透過Description Attribute,註記其對應的Comlumn欄位順序
  • Coravel:透過該套件,將寫好的Service掛成排程任務
  • Extension Method:有一些通用的Method,不要落落等塞在一個Service中,因此轉換成可以共用的Extension Method
  • EFCore:資料存取用開發套件

內容

此篇內容主要運用到Coravel套件的Job宣告方式,並將該Job透過DI方式注入,DotnetCore世界中,DI是一個顯性哲學,一切為DI,因為DotnetCore本身就已經有配置一套標準的DI底層框架,且是預設的,因此沒有不用的道理阿。

[DotnetCore]排程利器-Coravel:Scheduler篇中可以看到`Coravel`使用的解說,筆者這邊就不特別說明直接奉上宣告片段,並著重在泛型使用上面的解說
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class DomainJob<T> : IInvocable
where T : BaseModel
{
private readonly IDomainJobService<T> _domainJobService;

public DomainJob(IDomainJobService<T> domainJobService)
{
_domainJobService= domainJobService;
}
public Task Invoke()
{
if (_domainJobService.CanRunOrNot())
{
_domainJobService.DoProcess();
}
return Task.CompletedTask;
}
}

接著將相關的Job以及Service注入於Dotnet CoreDI Container

1
2
3
4
5
6
// FtpService為從Ftp下載的實作
// FtpSetting為筆者這邊環境使用,宣告FtpServer的位置,登入帳號及密碼,還有相對路徑設定值對應的Property
services.AddTransient<IFtpService, FtpService>();
services.AddTransient(typeof(DomainJob<>));
services.Configure<FtpSetting>(config.GetSection("Ftp"));
services.AddTransient(typeof(IDomainJobService<>), typeof(DomainJobService<>));

最後透過CoravelAddScheduler的方法將上述Job加進CoravelScheduler排程中

1
2
3
4
5
6
app.ApplicationServices.UseScheduler(scheduler =>
{
scheduler.Schedule<DomainJob<AModel>>().EveryMinute();
}).OnError((exception) =>
// Log Error
);

結論

筆者發現,撰寫程式碼才不到三小時,花好多時間解釋其原理,卻花了筆者半天時間,由此可知要好好心存感激那些大神們願意花時間將自己所學知識發佈於部落格中,才能有一個正向回饋,自己所學運用於工作中,再反饋於部落格文章中,是一個正向的循環,希望這系列文章有幫助到你。

參考