0

私は3つのレイヤーでアプリケーションを設計しようとしています:

1) データアクセス層
2) ビジネス層
3) UI

私はクラスを分離したままにしようとしているので、ビジネス層では次のようなデータ アクセス クラスのインターフェイスを作成しました。

public interface ICountryRepository:IRepository 
{
    Country  GetCountry(int ID);

    int CreateCountry(Country obj);
    Boolean UpdateCountry(Country obj);
    Boolean DeleteCountry(Country obj);
    ...
    ...
 }

そして、インターフェイスをパラメーターとしてサービス コンストラクターに渡します。

   public CountryService(ICountryRepository repository,ILanguageRepository lang_repository)
   {       
    ....
   }

ただし、たとえば CountryService では、現在のユーザーとそのアクセス許可を読み込む必要があるため、操作を適用できるかどうかを確認できます。

    public Country GetCountry(int ID)
    {

        if securityService.UserHasPermission(currentUser, GetPermission("CanGetCountry"))
        {
           return repository.GetCountry(ID);
        }
        else
        { 
           Throw(New SecurityException("No permissions for that operation ...."))
        }

    }

つまり、SecurityDataAccess オブジェクトをインスタンス化し、それをビジネス レイヤー アセンブリの SecurityService のコンストラクターに渡す必要があります。これは、オブジェクトの分離を維持するために避けようとしています。現在、ビジネス アセンブリの DataAccess アセンブリへの参照さえありません。

ここで IoC コンテナーを使用することを考えています。外部構成を使用して、構成ファイルから適切なクラス/アセンブリを取得できました。しかし、IoC コンテナーは物事をシンプルに保つために 1 か所で使用する必要があり、ほとんどの場合、最上位アセンブリ (UI アセンブリ) にする必要があると言われているため、それが正しい解決策であるかどうかはわかりません。

この問題を解決するための提案はありますか?

4

3 に答える 3

1

Country サービスのコンストラクターにセキュリティ サービスを追加してみませんか? そうすれば、IOC コンテナは依存関係を解決し、必要に応じてセキュリティを注入できます。つまり、IOC コンテナーが CountryService オブジェクトの構築を処理します。そして、コンテナを使用してすべてのサービスを取得します。

別のオプションは、リポジトリを少し「正規化」することです...

すべてのリポジトリで同一の 4 ~ 5 個の基本機能しか持たないように切り詰めてから、ジェネリックを使用してそれらをすべて似たようにします。

UpdateCountry(...) が Update(T オブジェクト)

このようなもの: http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the-generic-repository.aspx

次に、チェーン オブ レスポンシビリティ パターンを使用して、DB コードの前にセキュリティ コードを配置できます ( http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern ) 。

したがって、アクセスを検証し、無効な場合は例外をスローするか、チェーン内の次のリンクにリクエストを渡す SecurityChecker を使用できます (その方法やタイミングなどを動的に追加することもできます)。

于 2009-09-12T07:59:53.737 に答える
0

データ アクセス層にセキュリティを実装する必要がありますか? Heiko が提案するように、セキュリティ サービスをビジネス層に移動するとします。つまり、ビジネス レイヤーでセキュリティを実行すると、IoC の問題を完全に回避できます。

于 2009-09-12T12:17:39.073 に答える
0

これは的外れかもしれませんが、そうである場合は申し訳ありません。私は潜在的な Java EE プログラマーです。メソッドの承認は、宣言的にインフラストラクチャでより適切に対処できるように思えます。

この記事は、.Net が Java EE と同様に、アクセスを宣言的に制御する機能を提供していることを示唆しているようです。このアプローチはあなたに適していますか?

于 2009-09-13T21:18:35.020 に答える