我知道這是相當基本的東西,但請隨身攜帶。這裏很熱(目前35攝氏度),所以我的大腦可能處於融化階段。C#數據庫訪問,Dapper,SQL和POCOs - 編程設計
長話短說,假設我們在SQL表在C#中這樣表示:
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public string Picture { get; set; } // filename of the picture, e.g. apple.jpg
public int CategoryID { get; set; }
}
現在我們將查詢數據庫和檢索對象,讓我們有這樣的價值觀說:
ID = 1
Name = Yellow apple
Picture = apple.jpg
CategoryID = 25
所有完全正常。我現在正在思考的是這樣的:如果我想展示一個產品,我需要一些額外的信息,而不是從數據庫查詢,比如圖像的確切文件路徑,我們所有的都是
apple.jpg
,但我們需要可能像
〜/圖片/ apple.jpg
所以,我想的是3種可能性:
1)一個新的屬性添加到類產品
public string PictureUrl
{
get
{
return "~/images/apple.jpg";
}
}
2)指定完整的URL進行演示邏輯的過程中,讓我們說:
public void ShowProductDetails()
{
Product p = ProductRepo.GetProduct(id);
txtName.Text = p.Name;
imgPicture.ImageUrl = "~/images/" + p.Picture;
}
3)使用Decorator模式
第一種方法似乎是錯誤的我(儘管我一直USI長時間),因爲我試圖建立一個分層的Web應用程序。我不確定硬編碼這是一個好方法。
第二種方法更好,但更糟糕的是它不容易重複使用。如果我有多個地方我正在做同樣的事情和一些變化,...也許它會工作,如果我指定一些靜態常量保存路徑...
第三種可能性似乎相當複雜的可維護性方面。我的課程數量可能會翻一番。如果我現在有30班,它會突然變爲60:/
什麼是最好的/推薦的做這種事情的方式是什麼?如果我將屬性添加到未包含在數據庫模式中的POCO中,我無法使用Dapper.Contrib或Rainbow和類似的庫,因爲即使「選擇」工作正常,我也無法「插入」,也無法「刪除」。我必須對每個命令的sql字符串進行硬編碼,這些命令在一段時間後變得非常單調乏味,當時你一直在做同樣的事情。
編輯:
好吧,也許我本來應該更具體的...從戈文德KamalaPrakash馬爾維亞的解決方案是偉大的,但不能每次都使用。我需要一種方法來解決任何類型的屬性,甚至是更復雜的屬性 - 例如某些相冊的照片數量。查詢照片的數量和相冊是一個好主意,但將它分配給什麼?使用Decorator模式創建裝飾類?
你如何解決這種架構問題?
謝謝你的回答!謹慎展示一個例子,使用你的方法會是什麼樣子?聽起來有點像Decorator模式與Factory模式的結合。 :-) – walther
我添加了一個簡單的例子。它使用一個工廠,但這也可能只是另一個類中的工廠方法。它沒有實現Decorator模式,但可以根據需要擴展。我儘量保持簡單。 – EagleBeak
謝謝。我會等待別人是否提出了不同的解決方案,如果不是,我可能會選擇你的答案,因爲它似乎更適合我的需求,而不是Govinds的回答。 – walther