2

ASP.NET MVC 3 アプリケーション内から基本的なタスクを管理するために作成した Active Directory サービスがあります (ただし、別のアセンブリにあるため、実際には任意の .NET アプリケーションである可能性があります)。1 つの基本インターフェイスとクラスがIActiveDirectoryService<TPrincipal>あり、ActiveDirectoryService<TPrincipal>. これらは、次のようにIUserPrincipalServiceとまで 1 レベル拡張されます。UserPrincipalService

IUserPrincipalService : IActiveDirectoryService<UserPrincipal> {
}

UserPrincipalService : ActiveDirectoryService<UserPrincipal>, IUserPrincipalService {
}

Ninject を使用して、使用したいIUserPrincipalServiceを渡すシングルトン インスタンスを作成します。PrincipalContextこれは問題なく動作しますが、ユーザーを追加する OU ごとに複数のインスタンスを作成する必要があり、名前が競合するため、Ninject では機能しません。

必要な特定の OU をこのサービスに渡す方法を見つける必要があります。ICityStateUserPrincipalService : IUserPrincipalServiceインターフェースを拡張して、Ninject でコンストラクターを変更することを考えました。これに関する問題は、現在所有している OU (たまたま 7 つ) ごとにこれらのサービスのいずれかを作成する必要があることです。また、将来、新しい OU を追加する必要がある場合は、AD でそれを作成し、そのための新しいインターフェイスも作成する必要があります。

これはちょっと気分が悪いです。また、ASP.NET MVC 3 アプリケーション内で実行する必要があり、肥大化とチートが追加されているように感じます。さまざまなプロジェクトで使用する必要がある場合に備えて、そのジェネリックを保持したいため、現在のサービスを収容するアセンブリに追加できません。

現在持っているものを保持し、特定の OU のパスを渡すことができるように拡張可能にする方法はありますか?

質問のタイトルはおそらくあまり良くありません。私はそれを変更するための提案を受け入れていますが、それを表現する方法がわかりませんでした...

4

1 に答える 1

1

IOUProviderサービスに挿入されるインターフェースを追加できます。IOUProvider インターフェースは、どの OU をIActiveDirectoryService考慮する必要があるかを決定します。

以下の例をスタブ化しTPrincipal、 の概念に関連しているとは思わないため、 を省略しました。IOUProvider

public interface IOUProvider
{
        IEnumerable<OUInfo> GetOUs();
}    

public interface IActiveDirectoryService
{
    IOUProvider RelevantOUProvider { get; }
    IPrincipal FindPrincipals();
}

public class ActiveDirectoryService : IActiveDirectoryService
{
       public ActiveDirectoryService(IOUProvider relevantOuProvider)
       {
       }
}
于 2012-08-22T20:43:47.013 に答える