3

私がモデルを持っていると仮定します:

public class Thing
{
    public int? identifier { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    ... // arbitrary number of additional properties.
}

そして、2つの主要なメソッドを含むサービスレイヤーへのインターフェース:

public interface IThingService
{
    Thing GetThing(int id);
    Thing AddThing(Thing thing);
}

ここで、サービスレイヤーがidentifierにそれぞれのforを自動的に生成するとしますAddThingidentifierまた、他のサービスに渡される可能性があるため、これをプレゼンテーション層に公開することが重要であると想定します。

Thingにを渡す必要があることを考えるとAddThing、これはモデリングの最良の方法Thingですか?プレゼンテーション層の開発者は、を指定できると思うかもしれませんidentiferが、これはの具体的な実装では無視されIThingServiceます。もちろん、identifierによって設定される公開されている必要がありIThingServiceますGetThing

への呼び出しで渡されたものを単に無視しても大丈夫ですか、それともそれが起こらないようにこれをモデル化するより良い方法がありますか?identifierAddThing

4

3 に答える 3

2

サービスは次のようになります。

public interface IThingService
{
    Thing GetThing(int id);
    ThingCreationResponse AddThing(ThingCreationRequest request);
}

ThingCreationRequestThingエンティティを作成するために必要なすべてのデータが含まれます。識別子はありません。によって識別子が返されAddThingます。

AddThing単純に ID を返すこともできThingますが、その場合は、エラーを伝えるための十分に文書化されたプロトコルを提供する必要があります (失敗の場合は負の値を返すか、例外をスローします)。

のインスタンスをThingCreationResponse返すと、新しい の ID または完全なインスタンスを返すことができるため、柔軟性が向上しますThing。また、失敗の理由をより適切に伝えることができます。

于 2013-03-23T19:06:17.047 に答える
1

Thingこれは、オリジナルが実際に存在するのと同じメモリでサービスが動作している場合にのみ機能します。たとえば別のマシンでこのサービスが切断されている場合、 を更新してThingも元のインスタンスには影響せずidentifier、呼び出し元のコードに が返されることはありません。

このことを念頭に置いて、2 つの可能なパスがあります。このサービスが常にローカルであり、呼び出し元のアプリケーションと同じメモリで動作することを意図するか、このサービスが実際に切断されるか、最終的に切断されることを意図します。

接続済み

接続されている場合、このインターフェイスは正常に機能しますが、識別子のセッターを非表示にしたい場合があります。その場合は、それを内部にして、サービス インターフェイスとThingオブジェクトの両方を別のアセンブリで定義するだけで済みます。これにより、setter がプレゼンテーション層にアクセスできなくなります。ほとんどの場合、リフレクションやその他のハイジンクで呼び出すことはできますが、通常のものにはアクセスできません。

切断されました

このインターフェイスは、識別子を取得することができないため壊れており、現在保存されているアイテムを取得するために必要です。ここでの典型的な解決策は、メソッドから識別子を返すAddThingか、十分に小さい場合はオブジェクト全体 (新しいメモリ) を返します。

これらすべてを除けば、不変のデータ項目は推論するのが難しく、どちらの場合でも、とにかくThing呼び出した後に新しいものを作成することをお勧めします。AddThing

于 2013-03-23T15:23:44.890 に答える
0

この場合、AddThing の正しい署名は AddThing(string title, string description) になり、生成された識別子を使用して Thing オブジェクトを構築することがメソッドの義務になると思います。

最後の仕様を考慮して、メンバーとして識別子とモノを持つ ThingWithId という 2 番目のクラスを作成することをお勧めします。AddThing のシグネチャは ThingWithId AddThing(Thing thing) に変更されます。

于 2013-03-23T15:21:38.167 に答える