これは少し奇妙な質問かもしれませんが、私が持っているものは現在機能していますが、私には少し奇妙に感じられ、設計/アーキテクチャが貧弱なためではないかと思います. ここでの考えは大歓迎です。
初期の設計は、私が他の誰かから継承したコード ベースにあります。linq-to-sql クラスがあります (dbml のデザイナー ファイルで自動生成されます)。
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ARCustomers")]
public partial class ARCustomer : INotifyPropertyChanging, INotifyPropertyChanged
{
// variables
// extensibility method defs
// ctor
// properties
// etc.
}
次に、自動生成されたクラスの拡張バージョンである別のクラス クラスが呼び出されArCustomer
ます (小文字の "r" に注意してください)。拡張とは、LINQ クラスのすべてのプロパティに加えて、いくつかのロジックを設定する必要があるいくつかのプロパティを備えていることを意味します。
ARCustomer
を取得して に変換したいコードの場所がたくさんありますArCustomer
。ArCustomer
そこで、クラスに拡張メソッドを書きました (これが奇妙に感じました) 。
public static ArCustomer FromDatacontextObject(this ArCustomer customer, ARCustomer datacontextObject)
{
var arCustomer = new ArCustomer();
arCustomer.Id = datacontextObject.ProjectID;
// more of the same
// now populate the other fields that don't exist on the datacontextObject
return arCustomer;
}
というように呼ばれています。
var customerfromDb = accountReceivableRepository.GetCurCustomer(arId);
ArCustomer customer = new ArCustomer();
customer = customer.FromDatacontextObject(customerfromDb);
これは私には間違っているように感じますが、頭の中でより良い代替案を知りません. (拡張プロパティを含む部分クラスは機能しますか? コンストラクターにそれらを設定しますか?) または多分それは問題ありません...私はいくつかのことに興味があります...
- これが間違っている/奇妙である/悪いと感じているのは正しいですか?
- 具体的には、私が実装したソリューションに見られる短所は何ですか? 1つは、2つのクラスを区別してどちらがどちらであるかを理解しようとして、頭をかきむしりすぎているように感じます。
- 彼らの長所はありますか?
- より良い解決策はありますか (そしてなぜそれらが優れているのか)?
(無関係 - この種の質問がスタック オーバーフローに問題ないことを願っています。主観的である可能性があるミニ コード レビューを求めているように感じます。一方で、いくつかの具体的な質問をしようとしましたが、そうしなければならないと感じました。このような状況に遭遇したのは開発者だけではありません (「私はあるオブジェクトを持っていて、それを別のオブジェクトに変換する必要があります」)。そのため、スレッドを開いたままにしておくことで何かが得られることを願っています)。
みんなありがとう!