如何扩展通用?

时间:2012-08-22 20:27:25

标签: c# generics active-directory

我有一个Active Directory服务,我帮助我从ASP.NET MVC 3应用程序中管理基本任务(虽然实际上它可以是任何.NET应用程序,因为它在一个单独的部件)。我有一个基本接口和类,IActiveDirectoryService<TPrincipal>ActiveDirectoryService<TPrincipal>。这些扩展到IUserPrincipalServiceUserPrincipalService一级,如下所示:

IUserPrincipalService : IActiveDirectoryService<UserPrincipal> {
}

UserPrincipalService : ActiveDirectoryService<UserPrincipal>, IUserPrincipalService {
}

使用Ninject我创建了一个IUserPrincipalService的单例实例,传递了我希望它使用的PrincipalContext。这完全正常,但我现在必须为我想要添加用户的每个OU创建多个实例,并且这不会与Ninject一起使用,因为这些名称会发生​​冲突。

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

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

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

问题的标题可能不是很好。我愿意接受改变它的建议,我只是无法弄清楚如何用它来表达......

1 个答案:

答案 0 :(得分:1)

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

我在下面留下了一个示例,遗漏了TPrincipal,因为我认为它与IOUProvider

的概念无关
public interface IOUProvider
{
        IEnumerable<OUInfo> GetOUs();
}    

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

public class ActiveDirectoryService : IActiveDirectoryService
{
       public ActiveDirectoryService(IOUProvider relevantOuProvider)
       {
       }
}