1

C#、ASP.NET、MVC、WCF を使用する場合、非公開のビジネス ロジック サービス レイヤーがあり、セキュリティやその他の理由から、同じ操作を公開しているゲートウェイまたはファサード レイヤーがあると想定します。

したがって、パブリック/公開サービス層は呼び出し元ユーザーを表す GUID を処理する必要があり、プライベート/内部サービス層はより高度な認証を処理する必要があることを除いて、本質的に同一のデータ転送 (要求/応答) オブジェクトを持つ 2 つの層があります。チケット。この認証チケットは、公開層に公開しないでください。

PublicDto {
      Guid userGuid;
      string property1;
      ...
      string propertyN;
 }

PrivateDto {
      AuthenticationTicket authTicket;
      string property1;
      ...
      string propertyN;
 }

プライベート AuthenticationTicket をパブリック層から保護するが、プライベート DTO とパブリック DTO の間の差別化プロパティの切り取りと貼り付けを最小限に抑えるような方法で、基本クラスを派生させるか、ここでインターフェイスを利用する効率的な方法はありますか?

4

2 に答える 2

1

共通のプロパティのみを宣言する共通の基本クラスから両方を派生させる

public abstract class BaseDto {
    string property1;
    ...
    string propertyN;
} 

public class PublicDto : BaseDto {
      Guid userGuid;
}

private class PrivateDto : BaseDto {
      AuthenticationTicket authTicket;
}

アップデート:

まったく異なるアプローチは、シリアル化のために実行可能な方法である場合、プロパティを一般的な方法で処理することです。

public class PublicDto {
      public Guid userGuid { get; set; }
      public Dictionary<string,string> Prop { get; }

      public PublicDto ()
      {
          Prop = new Dictionary<string,string>();
      }
}

使用法

dto = new PublicDto();
Prop["FirstName"] = "John";
Prop["LastName"] = "Doe";

更新 #2

1

パブリック dto からプライベートを派生させることができます。Guid は、プライベート dto では使用されないままになります。

2

一般的なソリューション

public class Dto<T> {
    public T ID { get; set; }

    string property1;
    ...
    string propertyN;
} 

var publicDto = new Dto<Guid>();
var privateDto = new Dto<AuthenticationTicket>();
于 2012-03-20T23:22:31.477 に答える
1

いくつかのインターフェイスと 1 セットの DTO を作成してから、正しいインターフェイスが渡されることを確認してください。

public interface IAnyPublic { Guid user; }
public interface IAnyPrivate { AuthenticationTicket ticket; }
public interface IOneBase { int foo; string goo; }
public interface IOnePublic : IOneBase, IAnyPublic { } // nothing to add, sir!
public interface IOnePrivate : IOneBase, IAnyPrivate { } // nothing to add, sir!
public class OneBase : IOnePublic, IOnePrivate { /*implement*/ }

あとは、チケットが必要な場合 (チケットのみ) 、内部のものがIOnePrivate( )渡されていることを確認するだけです。IAnyPrivate同様に、パブリックなものは、ユーザー (ユーザーのみ) が必要な場合に渡されますIOnePublic( IAnyPublic)。最後に、ベースのみで定義されたメソッドはIOneBase.

于 2012-03-20T23:42:56.293 に答える