私は、古いVB6 UI/COBOLデータベースアプリケーションを現代に改造するチームの一員です。私が雇われる前に、データベースの前にUIをやり直すという決定が下されました(主に売り上げ、私は確信しています)。ですから、今はWPFとMVVMを使って大きな効果を上げています。これまでのところ、特にModelレイヤーとしてCSLAを使用するのは素晴らしいことです。C#CSLAビジネスオブジェクトのジレンマ:読み取り専用vs読み込み/書き込み
ただし、私たちの開発は古い製品の次のバージョンと並んでいるため、少し拘束されています。 COBOLデータベースへの呼び出しに対しては、変更(または最小限の変更)を行うことはできません。これまでのところ、SQL Serverの栄光の日々を信じることができます。
私はBOデザインに関して特に厄介なロードブロッキングを打ちましたが、リストに返された "軽い"ビジネスオブジェクトとその "完全な"対応を扱っています。例を試してみましょう:
人のオブジェクトがDBに複数のフィールドを持っているとしましょう。そのテーブルを検索すると、すべてのフィールドが返されるわけではないので、私たちはライトオブジェクトにこれらのフィールドを設定します。これらのフィールドは、完全な人のサブセットであってもなくてもよい。私たちは、検索に特有の他の情報を検索するために、1つまたは2つのジョインを行っている可能性があります。しかし、personオブジェクトを編集したい場合は、フルバージョンを取得してUIを生成するために別の呼び出しを行う必要があります。これは、私たちに2つのオブジェクトを残し、削除、編集、追加した後の親オブジェクトに個人リストを同期させようとしている間に、1つのVMでその状態をゆがめようとしています。もともと、私はライトオブジェクトをReadOnlyBase <>から派生させました。しかし、今では半分の半分、半分の半分を除いて完全なBOのリストを持つ同じリストの振る舞いを扱っているので、私はちょうどLiteとフルバージョンの両方をBusinessBase < >単にライト版のセッタープロパティをプライベートにしました。
他に誰かが出てきてこれに対する解決策を見つけましたか?それを眠った後、私はこの潜在的な解決策を思いついた。私たちはこのように、別のBOで私たちのBOのフルとliteのバージョンを包む場合:
public class PersonFull : BusinessBase<PersonFull>
{
...
}
public class PersonLite : BusinessBase<PersonLite>
{
...
}
public class Person : BusinessBase<Person>
{
public PersonFull PersonFull;
public PersonLite PersonLite;
}
public class PersonList : BusinessListBase<PersonList, Person>
{
}
明らかにすべてがCSLA登録プロパティと、そのようなことだろうが、簡潔にするために、彼らはそこにフィールドです。この場合、PersonとPersonListはすべてのファクトリメソッドを保持します。検索操作の後、PersonListにPersonLiteメンバーがすべて入力され、PersonFullオブジェクトがすべてnullだったPersonオブジェクトによってPersonListが作成されます。完全なバージョンを取得する必要がある場合は、単にPersonオブジェクトにそのように指示して、今はPersonFullオブジェクトを持っているので、編集UIを設定できます。 Personオブジェクトを削除する場合は、リスンしているすべてのVMでリストの整合性を維持しながら、CSLAの削除プロシージャを使用して簡単に行うことができます。
私はこれが誰にとっても意味をなさないことを願っています。誰かが違う解決策を持っていれば、彼らはこれを成功裏に批判しています。
ありがとうございます!
(から再掲:http://forums.lhotka.net/forums/thread/35576.aspx)
私は、あなたが提案しているものが解決すべきものであるかどうかは完全にはわかりません。ライトBOは、ライト版からのユニークなデータで完全なBOを水和するためにDBに行くことができるので、完全なBOを決して投入することはありません。私は編集後にライトバージョンを更新するフルバージョンを見ることができたと思うが、これは本当にそれについて行く方法ではない。 – opedog
ライト版は、完全版を完全に埋め込むことはできませんが、ユーザーに表示され、残りのデータが遅延ロードされるように十分である可能性があります。私はこれまでいくつかの成功を収めてきました。メモリオブジェクトを修正しようとしているなら、これに対するあなたのアプローチは全く異なるでしょう。 – Joseph
フロントエンドが完了した時点でバックエンドBOを再構築する予定であれば、すべてのプロパティを含む新しいCSLAオブジェクトから開始するテストケースとして使用してみましょう。 –