2012-08-22 139 views
2

我有一個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的路徑?

問題的標題可能不是很好。我願意改變它的建議,我只是不知道如何說出它...

+0

您可以添加在傳遞到每個服務,指定IOUProvider界面概念冷落的TPrincipal哪些OU有興趣 – cordialgerm

+0

@pickles,你能給我一個代碼示例嗎?此刻,我的大腦已經成功地將自己弄糊塗了...... – Gup3rSuR4c

回答

1

您可以添加一個IOUProvider接口,它被注入到您的服務。 IOUProvider接口確定哪些OU應該關心。

下面我掐滅一個例子,因爲我不認爲這是相關的IOUProvider

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

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

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