0

以下の例のような複数レベルのクラス階層があります。

                  Model                                      Dto
                 /    \                                     /  \
     CompanyModels    User Model, etc..           CompanyDto   UserDto, etc..
     /         \                                  /        \
PeopleModel  OfficeModel                     PeopleDto   OfficeDto

すべての "Company Models" は同じプロパティ (名前、住所など) を共有し、子モデル "People"、"Office" などは追加のプロパティを追加します。

「モデル」基本クラスには、次のメソッドがあります。これは、モデルをネットワーク経由で渡すのに必要なものだけに分解することを目的としています。

public virtual T AsDto<T>() where T : Dto, new()
{
     var dto = new T();

     dto.CreatedDate = this.CreatedDate;
     dto.CreatedUserID = this.CreatedUserID; //etc..

     return dto;
} 

私の人生では、「CompanyModel」が「PeopleModel」と「OfficeModel」の両方で共有されるプロパティの割り当てを処理できるようにするための最適なパターンを見つけることはできません。

現在、私は以下の設定をしていますが、うまくいかないことはかなり確信しています:

public class CompanyModel : Model
{
     public override CompanyDto AsDto<T>()
     {
          CompanyDto c = base.AsDto<CompanyDto>();
          c.CompanyName = this.CompanyName; //etc...
          return c;
     }
}

public class PeopleModel : CompanyModel
{
     public override PeopleDto AsDto<T>()
     {
          PeopleDto p = base.AsDto<PeopleDto>() as PeopleDto; //will return null
          p.FirstName = this.FirstName;
          p.LastName = this.LastName; //etc...
          return p;
     }
}

これを達成するための正しいパターンが何であるかを理解するのを手伝ってください...

前もって感謝します!

4

1 に答える 1

0
public class Model
{
    public DateTime CreatedDate { get; set; }
    public int CreatedUserID { get; set; }

    public virtual Dto AsDto()
    {
        return FillDto(new Dto());
    }

    protected Dto FillDto(Dto dto)
    {
        dto.CreatedDate = this.CreatedDate;
        dto.CreatedUserID = this.CreatedUserID; //etc..
        return dto;
    }
}


public class CompanyModel : Model
{
    public string CompanyName { get; set; }

    public override Dto AsDto()
    {
        return FillDto(new CompanyDto());
    }

    protected CompanyDto FillDto(CompanyDto dto)
    {
        base.FillDto(dto);
        dto.CompanyName = this.CompanyName;
        return dto;
    }
}

public class PeopleModel : CompanyModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override Dto AsDto()
    {
        return FillDto(new PeopleDto());
    }

    protected PeopleDto FillDto(PeopleDto dto)
    {
        base.FillDto(dto);
        dto.FirstName = this.FirstName;
        dto.LastName = this.LastName; //etc...
        return dto;
    }
}
于 2013-08-11T23:15:32.783 に答える