1.概要
本文主要分享如何Shared Project使用,和避坑。
1.1什麼是Shared Project?
說簡單一點就是微軟提供的一個代碼共享項目模闆,從 Visual Studio 2015 起,共享項目 (Shared Project) 作為新的一種項目類型被添加到項目模闆清單中,它帶來的好處主要是使多個不同類型、不同平台的項目之間可以共享代碼或資源這樣我們就不用去重複寫代碼,或者在特殊情況下就不用将一個類直接拷貝到另外一個類庫下。
1.2如何使用?
1.2.1建立項目
找到項目模闆
1.2.2使用
建立完成之後,庫的圖示和正常的C#庫不一樣是兩個菱形。
接着建立一個類,代碼如下:
public class Class1
{
public int Calculation(int i,int j)
{
return i + j;
}
}
然後在需要share的項目上添加引用,接着正常通過類名正常通路該方法即可
2.詳細内容
2.1解讀
Shared Project當然還有其他的使用場景這裡就介紹基本用,看完以上操作之後大家可能會認為建立一個普通的類庫好像也能實作,實際上也差不多。
- 普通類庫的有一個弊端就是在大家誤操作的時候會出現類庫與類庫之間項目引用變成了“循環引用”,而Shared Project隻能被别人引用。
- 将不受平台、架構限制的通用代碼可以放到Shared Project。
可能更多的會在設計上考慮在Shared Project中放些通用的代碼,以Prism舉例:
Prism的設計是将xxx.Container(容器)放到了Shared Project中,這樣在相容Wpf和Forms上就不用重複寫Container相關的代碼了,舉一反三那麼如果要相容MAUI和Avalonia實作同樣的架構設計那麼拿來直接用即可。
2.2使用注意
最近在研究用DDD寫服務端,出現一個場景。當拆分多個服務的時候每個細分服務都會使用HttpResponseDTO,那麼這個時候我不想使用類庫造成“引用混亂”自然是想到使用Shared Project。
結果我在使用的時候出現了一個問題,在寫web api層的時候會用HttpResponseDTO,在Application層也會用到我同時在這兩層同時引用了Shared Project裡的HttpResponseDTO這個時候就出現了一個沖突這個問題查了一早上。項目結構如下:
代碼:
[HttpPost]
public async Task<HttpResponseDTO<bool>> Upload(UplaodVersionDTO version, HttpRequest request)
{
try
{
//.....
//這句代碼報錯,從Application層引用的實作邏輯。
return await _upgradeService.Upload(version, file.Item1, file.Item2);
}
catch (Exception ex)
{
_logger.LogError(ex, ex.Message);
return HttpResponseDTO<bool>.InnerException(false, ex.Message);
}
}
錯誤:
嚴重性 代碼 說明 項目 檔案 行 禁止顯示狀态
錯誤 CS0029 無法将類型“xxx.Domain.Shared.DataTransferObjects.HttpResponse<bool> [AService.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=]”
隐式轉換為“xxx.Domain.Shared.DataTransferObjects.HttpResponse<bool> [AService.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=]”
AService.Api
怎麼樣想都沒有想明白為什麼會出現這種問題,當我把web api層的Shared Project引用移除之後就正常了。原來VS會将不同層的引用的Shared Project視為不同的對象。