2

私は、WCF サービスを介してすべてのビジネス ロジックを利用できる多層システムを使用しています。

ここで、次のシナリオを検討してください。

  1. ユーザーが Web アプリケーション (ASP.NET MVC 4) を開き、WCF サービスからエンティティを要求します。
  2. WCF サービスがデータベースからエンティティを読み取ります (NHibernate を使用)
  3. エンティティはセキュリティ レイヤーを通過し、ユーザーがこのエンティティの特定のフィールドを表示してはならないことがわかります。
  4. プレゼンテーション レイヤー (それが何であるかは関係ありません。Web アプリ、モバイル アプリ) は通常、ユーザーのセキュリティ権限を認識する必要はありません。プレゼンテーション層は、サービスから受け取ったすべてのフィールドを取得してレンダリングします。

サービスのエンティティから不要な情報を取り除き、サービスが返したくないエンティティ フィールドをプレゼンテーション レイヤーが認識しないようにするにはどうすればよいですか? これを達成するためのベストプラクティスは何ですか?

DTO (データ転送オブジェクト) を使用する必要があると思いますが、厳密に定義することはできません。セキュリティ レイヤー (または他のフィールド フィルタリング システム) が開始されるまで、どのユーザーが各フィールドにアクセスできるかがわからないためです。

4

1 に答える 1

1

これが「ベスト プラクティス」であるとは言えませんが、これは Rockford Lhotka がExpert C# 2008 Business Objectsで採​​用した少なくとも 1 つのアプローチです。

最終的にすべてのドメイン エンティティを何らかの基本クラスから派生させることができます。その基本クラスには、次のようなメソッドを含めることができます。

public virtual bool CanReadProperty(string propertyName) { ... }

このメソッドは、ユーザーが表示 (または設定) できるようにする前に、各プロパティから呼び出すことができます。パフォーマンスを向上させるために、その基本クラスに承認ロールをキャッシュすることができたので、チェックは高価な操作ではありませんでした。そしてもちろん、式ツリーがCanReadProperty()できたので、強く型付けされた式を取得できます。

プロパティの例は次のようになります。

public string Name
{
    get
    {
        if (!CanReadProperty("Name")) { return string.Empty; } // or return null, whatever...
        return _name;
    }
}

このアプローチの利点は、これらのプロパティの表示が変更される可能性があるさまざまなシナリオで、多くの異なる DTO が必要ないことです。

于 2013-01-05T16:55:59.600 に答える