次のように C# で表された SQL のテーブルがあるとします。
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
すべて完全に正常です。現時点で私が考えていることは次のとおりです。製品を表示したい場合、画像への正確なファイルパスなど、データベースからクエリされていない追加情報が必要です。
りんご.jpg
、しかし、おそらく次のようなものが必要です
〜/images/apple.jpg
そこで、以下の3つの可能性を考えました。
1.) 新しいプロパティをクラス Product に追加します
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.) デコレータ パターンを使用する
最初のアプローチは (かなり長い間使用してきましたが) 私には間違っているように思えます。これをハードコーディングするのが良い方法かどうかはわかりません。
2 番目のアプローチの方が優れていますが、簡単に再利用できないという意味では悪い方法です。同じことをしている場所が複数あり、何かが変わった場合...パスを保持する静的定数を指定するとうまくいくかもしれません...
3 番目の可能性は、保守性の点で非常に複雑に思えます。私のクラスの数は、おそらく倍増する必要があります。今30のクラスがあるとしたら、突然60になります:/
このようなことを行うための最良/推奨の方法は何ですか? db スキーマに含まれていないプロパティを POCO に追加すると、Dapper.Contrib や Rainbow などのライブラリを使用できなくなります。消去"。すべてのコマンドに対して SQL 文字列をハードコーディングする必要がありますが、これは、同じことを常に行っていると、しばらくすると非常に面倒になります。
編集:
Govind KamalaPrakash Malviya のソリューションは素晴らしいですが、毎回使用できるわけではありません。アルバムの写真の数など、より複雑なものであっても、あらゆるタイプのプロパティについてこれを解決する方法が必要です。アルバムと一緒に写真の数を照会するのは良い考えですが、何に割り当てますか? Decorator パターンを使用して装飾されたクラスを作成しますか?
この種のアーキテクチャの問題をどのように解決しますか?