我有一个Active Directory服务,我帮助我从ASP.NET MVC 3应用程序中管理基本任务(虽然实际上它可以是任何.NET应用程序,因为它在一个单独的部件)。我有一个基本接口和类,IActiveDirectoryService<TPrincipal>
和ActiveDirectoryService<TPrincipal>
。这些扩展到IUserPrincipalService
和UserPrincipalService
一级,如下所示:
IUserPrincipalService : IActiveDirectoryService<UserPrincipal> {
}
UserPrincipalService : ActiveDirectoryService<UserPrincipal>, IUserPrincipalService {
}
使用Ninject我创建了一个IUserPrincipalService
的单例实例,传递了我希望它使用的PrincipalContext
。这完全正常,但我现在必须为我想要添加用户的每个OU创建多个实例,并且这不会与Ninject一起使用,因为这些名称会发生冲突。
我需要找到一种方法将我想要的特定OU传递给此服务。我想过将接口扩展到像ICityStateUserPrincipalService : IUserPrincipalService
这样的东西,并用Ninject改变构造函数。这个问题是我必须为我们现在拥有的每个OU(恰好是七个)提供这些服务之一。此外,将来如果我们需要添加一个新的OU,我必须在AD中创建它,然后为它创建一个新的接口。
这感觉不对。它还必须在ASP.NET MVC 3应用程序中完成,感觉就像是在为它添加膨胀和欺骗。我无法将其添加到包含当前服务的程序集中,因为我希望保留该通用程序,以防我需要在不同的项目中使用它。
有没有办法既保留我现在拥有的东西,又使其可扩展,以便我可以传入特定OU的路径?
问题的标题可能不是很好。我愿意接受改变它的建议,我只是无法弄清楚如何用它来表达......
答案 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)
{
}
}