2016-05-10 5 views
2

を持つ単純なインジェクタ条件付きで登録:私は、次のインタフェースで定義されたクラスを使用するアプリケーションを書いている代表者

public interface ICredentialProvider 
{ 
    string GetUsername(); 
    string GetPassword(); 
} 

方法ではなく、それのユーザ名/パスワードを取得するために呼び出すことができるので、これが行われますメモリに静的に保持され、code/configファイルで定義されます。

public class FakedCredentialProvider : ICredentialProvider 
{ 
    private readonly string _username; 
    private readonly string _password; 

    public FakedCredentialProvider(string username, string password) 
    { 
     _username = username; 
     _password = password; 
    } 

    public string GetUsername() 
    { 
     return _username; 
    } 

    public string GetPassword() 
    { 
     return _password; 
    } 
} 

...コンストラクタ内の2つの文字列を受け付けます。

現在開発中で、私はこの非常に単純な実装を使用しています。 ICredentialProviderの将来(実際の)実装では、適切な外部パスワード保管庫またはサービスに接続するための特定の文字列を受け入れる必要があります(または両方とも、プロジェクトのこの時点で不明です)。

さらに、このプロジェクトでは、接続に必要なさまざまなアカウント(SharePoint、ActiveDirectory、Windows Graphなど)に複数のICredentialProviderというインスタンスを使用します。

私は、デリゲート経由で登録する方法を知っているこれらの両端に

container.RegisterWebApiRequest(() => 
    new FakedCredentialProvider(fakedSharePointUsername, fakedSharePointPassword)); 

...そして、条件付きで登録する方法を...

container.RegisterConditional(typeof(ICredentialProvider), typeof(FakedCredentialProvider), 
     context => 
     context.Consumer.Target.Name.ToLower().Contains("sharepoint") 
    ); 

...ではなく、どのように組み合わせますか二。

これら2つのアプローチをどのように組み合わせますか?あるいは、これらのような状況のためのより良いデザインはありますか?

+1

私がより良いと思います設計は、各資格プロバイダのために異なるインタフェースを作成することです。この理由は、sharepoint-credential-providerを使用するクラスは、アクティブディレクトリ - 資格プロバイダと正しく動作しないためです。資格証明プロバイダは、互換性がないため、設計上、これを区別できません。 – Maarten

+0

@Maarten返された値は交換できませんが、外部契約は交換可能です。それだけでなく、資格証明は最終的にすべてCyber​​arkのパスワードボールトまたはウェブサービスに保存されるため、SharePointとADのアクセス(たとえば)では両方ともCy​​ber​​arkPasswordVaultCredentialProvider:ICredentialProviderを使用する可能性があります。 SOLID主導のインターフェースは決して適切ではないと私は思っていますが、外部からは同じものであり、具体的な実装を共有しています。 –

+0

なぜあなたはICredentialProviderをまったく持っていますか?これらの資格情報を直接必要とするクラスに注入しないでください(これらの値は実行時の値ではなく、設定値であることが前提です)。 – Steven

答えて

3

私は、私は完全にあなたの制約や設計を理解しているかどうかわからないんだけど、条件付きの代表者の登録を行う方法がRegistrationオブジェクトを受け入れRegisterConditionalオーバーロードのいずれかを使用している:

var container = new Container(); 
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(); 

container.RegisterConditional(typeof(ICredentialProvider), 
    Lifestyle.Scoped.CreateRegistration(() => new FakedCredentialProvider(user, pwd), 
     container), 
    c => c.Consumer.Target.Name.ToLower().Contains("sharepoint")); 
+0

申し訳ありませんが、私はデザインについて明確ではなかった場合;時々私はテキストの中で私の考えを下げるのに苦労します。私は答え、スティーブンを感謝します。 –

関連する問題