2

我创建了一个 Active Directory 服务来帮助我从 ASP.NET MVC 3 应用程序中管理基本任务(尽管实际上它可以是任何 .NET 应用程序,因为它位于单独的程序集中)。我有一个基本接口和类,IActiveDirectoryService<TPrincipal>并且ActiveDirectoryService<TPrincipal>. 这些被扩展一级到IUserPrincipalServiceand UserPrincipalService,如下所示:

IUserPrincipalService : IActiveDirectoryService<UserPrincipal> {
}

UserPrincipalService : ActiveDirectoryService<UserPrincipal>, IUserPrincipalService {
}

IUserPrincipalService使用 Ninject 我创建了一个传入PrincipalContext我希望它使用的单例实例。这工作得很好,但我现在必须为每个要添加用户的 OU 创建多个实例,这不适用于 Ninject,因为名称会发生​​冲突。

我需要找到一种方法将我想要的特定 OU 传递给该服务。我考虑过将接口扩展为类似的东西,ICityStateUserPrincipalService : IUserPrincipalService并用 Ninject 更改构造函数。这样做的问题是,我必须为我们现在拥有的每个 OU(恰好是七个)提供这些服务之一。另外,将来如果我们需要添加一个新的OU,我必须在AD中创建它,然后为它创建一个新的接口。

这只是感觉不对。它还必须在 ASP.NET MVC 3 应用程序中完成,这感觉就像它增加了膨胀和作弊。我无法将它添加到包含当前服务的程序集中,因为我想保留它的通用性,以防我需要在不同的项目中使用它。

有没有办法既保留我现在拥有的东西,又使其可扩展,以便我可以通过特定 OU 的路径?

问题的标题可能根本不是很好。我愿意接受改变它的建议,我只是不知道如何表达它......

4

1 回答 1

1

您可以添加一个IOUProvider接口来注入您的服务。IOUProvider 接口决定了IActiveDirectoryService应该关注哪些 OU。

我在下面删除了一个示例并省略了,TPrincipal因为我认为它与 an 的概念无关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 回答