4

「ビュー」を通じてオブジェクトを公開する柔軟な方法を見つけようとしています。例を挙げて説明したほうがいいかもしれません。

Entity Framework エンティティ モデルと、クエリに使用できる Web サービスがあります。エンティティ クラス自体を返すことはできますが、これには、共有したくないフィールドがいくつか含まれます。たとえば、ID や、エンティティ モデル内の任意の関連付けからの参照プロパティです。

必要なのはデータのビューだと思いますが、戻り値の型ごとにビュー ラッパー クラスを書きたいとは特に思いません。インターフェイスを定義して、それを何らかの形で利用できるようになることを願っています。例えば:

interface IPersonView
{
     string FirstName { get; }
     string LastName { get; }
}

-

// (Web service method)
IPersonView GetPerson(int id)
{
    var personEntity = [...];
    return GetView<IPersonView>(personEntity);
}

ただし、このようなことを行うには、エンティティにビュー インターフェイスを実装させる必要があります。オブジェクトには多くのビューが存在する可能性があるため、より柔軟な「ダックタイプ」のアプローチを望んでいましたが、それらすべてを実装する必要はありません。

インターフェイスを反映し、フィールドとプロパティをコピーすることで動的型を構築することに成功しましたが、Web サービスで強い型付けを行うためにこれをインターフェイス型にキャストすることはできません。

コメントとアドバイスを探しているだけで、どちらも大歓迎です。ありがとう。

4

2 に答える 2

3

エンティティをクライアントに直接渡すことは絶対に避けてください。永続性のためにのみ使用する必要があります。APIが返したいデータに合わせて調整されたDTO/POCOを導入する必要があります。

public class PersonDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// public API method
public PersonDto GetPersonApi(int id)
{
    var personEntity = // pull entity from db
    return new PersonDto()
    {
        FirstName = personEntity.FirstName,
        LastName = personEntity.LastName
    };
}

これにより、永続層とパブリックインターフェイスが明確に分離されます。AutoMapperなどのツールを使用して、データのマッピングに関するレッグワークを実行できます。たとえば、グローバルasaxでマッピングを1回設定するだけです。

protected void Application_Start()
{
    Mapper.CreateMap<Person, PersonDto>();
}
...
// public API method
public PersonDto GetPersonApi(int id)
{
    var personEntity = // pull entity from db
    return Mapper.Map<Person, PersonDto>(personEntity);
}
于 2013-01-24T14:39:29.213 に答える
1

私は通常、これがAutoMapperまたは同様のツールで行われているのを目にします。これにより、類似したクラス間のマッピングがはるかに簡単になります。Views(MVCコンテキストでは)を作成する必要がModelありますが、同じフィールド名を使用している限り、最も面倒な部分(マッピング)が自動的に処理されます。

ちなみに、データを更新する場合は、更新するレコードを知るためにキーを知る必要があるため、IDやその他の参照データを共有する必要があります。

于 2013-01-24T14:40:08.943 に答える