0

カードを含む「セット」というエンティティがあります。カード全体とその内容 (カード ビュー) を見たいときもあれば、セットに含まれるカードの枚数 (テーブル ビュー) だけを知りたいときもあります。物事を DRY に保つために、次のような複数のコンストラクターで SetDto クラスを再利用することにしました。

public class SetDto
    {
        public SetDto()
        {
            Cards = new List<CardDto>();
        }

        // Called via SetDto(set, "thin")
        public SetDto (Set set, string isThin)
        {
            var setDto = new SetDto()
                {
                    SetId = set.SetId,
                    Title = set.Title,
                    Details = set.Details,
                    Stage = set.Stage,
                    CardCount = set.Cards.Count
                };

            return setDto;
        }

        // Called via SetDto(set)
        public SetDto(Set set)
        {
            SetId = set.SetId;
            UserId = set.UserId;
            Title = set.Title;
            Details = set.Details;
            FolderId = set.FolderId;
            Stage = set.Stage;
            IsArchived = set.IsArchived;
            Cards = new List<CardDto>();
            foreach (Card card in set.Cards)
            {
                Cards.Add(new CardDto(card));
            }

        }

        /// property definitions

私は元々、セット用に 2 つの異なる DTO (ThinSetDto と FullSetDto) を持っていましたが、これは面倒でテストが難しいように思えました。上記の解決策は問題ないように見えますか、それとも既知のベストプラクティスに違反していますか? お時間をいただきありがとうございます!

4

4 に答える 4

0
public class BaseSetDTO
{
  public BaseSetDTO()
  {
    Set();
  }
  internal virtual void Set()
  {
    //Do your base set here with base properties
  }
}
public class SetDTO : BaseSetDTO
{
  internal override void Set()
  {
    //Do a full set here
  }
}

基本クラスを作成してから、タイプが設定するものを処理できるようにします。ThinSetDTO の新しい on を作成し、再度オーバーライドします。

于 2013-03-14T16:29:39.553 に答える
0

DTO ではなく、SetManager クラス (CRUD 操作を処理するクラス) に 3 つのメソッドを作成します。

dto には、内部にそのようなロジックはありません。とにかく、複製は役に立たない (そして悪である) ことに同意します。

于 2013-03-14T16:25:21.603 に答える
0

代わりに、Set クラスですべてのプロパティを宣言し、必要なパラメーターを渡してプロパティを変更する拡張メソッドをお勧めします。それ以外の場合は、baseDTO を初期化し、必要なプロパティを追加してさまざまなバージョンを用意し、拡張メソッドを呼び出して必要なバージョンの DTO を作成し、baseDTO を返します。

public static Set SetDto(this Set set, bool isThin)
{

  if(isThin)
  {

  }  


   return objSet;
}
于 2013-03-14T16:28:33.370 に答える
0

これに対する一般的な解決策は、リポジトリ(または同等のもの)に、異なるアクセス方法Get() ... GetSet()、つまり、必要なDTO /エンティティの「フレーバー」を返すようにするか、問題のエンティティの「フレーバー」を列挙して渡すことです。 「Get」(または同等の)メソッドに:

enum ContactCollectionFlavors { Full, CountOnly, CountWithNames .... }
...
foo = ContactRepository.GetByLastName('Jones', ContactCollectionFlavors.CountWithNames);

これは少し厄介になる可能性があります。経験から、問題のエンティティは、カプセル化と懸念の分離を破るために悪臭を放つ「フレーバー」が何であるかを知る方法が必要です。アウト オブ バンド データ。これにより、後でエンティティを遅延読み込みして、「ライト フレーバー」を完全に入力されたエンティティに変えることができます。

于 2013-03-14T16:41:36.340 に答える