7

その特定のものがシステムに必要なセキュリティの質問の数に答えたかどうかを示すプロパティを持つUserエンティティがあります。システムに必要なセキュリティの質問の数は構成可能であり、構成ファイルから取得されます。クラスは構成された情報にどのようにアクセスする必要がありますか?HasCompletedSecurityUserUser

現在、IConfigurationServiceインターフェイスがあり、その背後に、ConfigurationManagerまたはAzureと同等の機能が利用可能な場合はそれを使用する実装があります。静的クラスを介してDIコンテナへのアクセスをカプセル化し、InjectionService現在、次のように構成された値を解決しています。

public class User
{
    private static readonly IConfigurationService _configurationService = 
        InjectionService.Resolve<IConfigurationService>();

    public bool HasCompletedSecurity
    {
        get
        {
            // Uses the static _configurationService to get the 
            // configured value:
            int numberOfRequiredResponses = 
                GetConfiguredNumberOfRequiredResponses();

            return this.SecurityQuestionResponses.Count()
                >=
                GetConfiguredNumberOfRequiredResponses();
        }
    }
}

これはもちろんServiceLocatorアンチパターンの例であり、私はそれが少し好きではありません。静的な依存関係により、このクラスを使用するものはすべてユニットテストが厄介になります。

私はEntityFrameworkを使用していて、ここからキューを取得しています。エンティティをDIコンテナーに渡して依存関係を与えたくないので、代わりに構成された値にどのようにアクセスする必要がありますか?

編集:この正確な例を片側に(そしてその正しいアーキテクチャに関する提案に感謝します)、私が興味を持っているより大きな質問は、エンティティからのサービスへの非静的参照をどのように管理するかです。あなたが決して必要としないような方法でエンティティを設計するだけの答えはありますか?

4

2 に答える 2

5

Userクラスを定義する方法は次のとおりです。

public class User
{
    public bool HasCompletedSecurity { get; set; }

    // other members...
}

真剣に、これは時間的次元に沿って値を分離するため、より良い解決策です。これを考慮してください。ユーザーが2010年にすべてのセキュリティの質問を完了し、後でビジネスルールを変更した場合、既存のユーザーを無効にしますか?

ほとんどの場合、過去のある時点で、ユーザーがその時点で有効だったセキュリティ手順を完了したことを記録して保持する方が合理的です。そうすれば、既存のユーザーに迷惑をかけることはありません。

于 2012-01-31T13:53:18.630 に答える
1

ソートIoCコンテナを使用したり、エンティティのコンストラクタで使用したりしなくても、制御の反転の概念を引き続き使用できます。私は準戦略パターンを使用してこれにアプローチし、次のようなものを持っています:

public interface ISecurityPolicy
{
    public int MinimumSecurityQuestionResponses { get; }
}

public class User
{
    public void HasCompletedSecurity (ISecurityPolicy security_policy)
    {
         return this.SecurityQuestionResponses.Count()
                     >= security_policy.MinimumSecurityQuestionResponses;
    }
}

これにより、Userクラス自体ではなく、呼び出し元に対してユーザーが満たさなければならない特定のセキュリティポリシーを提供する責任が生じます。

IUserSecurityServiceその時点から、必要に応じて追加のパラメーターを指定できます。これを、サービスにISecurityPolicy注入されるパラメーターなどでラップすることもできます。

これは依然として制御の反転ですが、これはメソッドレベルです。これは、この1つの特定のメソッドが、セキュリティポリシー/構成を気にする唯一のメソッドであるためです。

于 2012-01-31T14:28:25.010 に答える