0

我在写一个通用类型来处理底层的Active Directory对象,如组,组织单位和用户。通用接口VS通用方法?

我也在我的通用接口中使用“手动”依赖注入。我想知道,在我的情况下,哪种更合适:泛型接口还是泛型方法?

下面是一个简单的代码示例,向您展示:

public interface IDirectorySource<T> where T : IDirectoryEntry { 
    IDirectorySearcher<T> Searcher { get; } 

    CustomSet<T> ToList(); // Related to my question, as I will here only return Searcher.ToList(); 
} 

public interface IDirectorySearcher<T> where T : IDirectoryEntry { 
    DirectorySearcher NativeSearcher { get; } 

    CustomSet<T> ToList(); // Related to my question... 
} 

public sealed class GroupSearcher : IDirectorySearcher<Group> { 
    public GroupSearcher(DirectoryEntry root, SearchScope scope) { 
     // Instantiating... 
    } 

    public DirectorySearcher NativeSearcher { get; private set; } 

    public CustomSet<T> ToList() { // That is the point of my question. 
     // Listing all T objects found in AD... 
    } 
} 

public sealed class DirectorySource<T> : IDirectorySource<T> where T : IDirectoryEntry { 

    public DirectorySource(IDirectorySearcher<T> searcher) { 
     Searcher = searcher; 
    } 

    public IDirectorySearcher<T> Searcher { get; private set; } 

    public CustomSet<T> ToList() { // Here's the point to my question. 
     return Searcher.ToList(); 
    } 
} 

所以,这里是我的观点。我想让我的IDirectorySource界面非一般化,因为我会推广我的DirectorySource<T>类到大众。所以我只需要声明的来源,像这样:

GroupSearcher groupSearcher = new GroupSearcher(root, scope); 
IDirectorySource groups = new DirectorySource<Group>(groupSearcher); 

所以我能够以检索该组的列表:

groups.ToList(); // Getting all the existing groups in AD here... 

但是我是否应该让我IDirectorySource<T>接口通用的我不知道,或者使其非泛型,并使我的IDirectorySource.ToList()方法通用,所以我不需要键入我的接口,而只需要为我提供接口实例的类。

它会更好写我的接口,像这样:

public interface IDirectorySource { 
    CustomSet<T> ToList<T>(); 
} // With all the appropriate changes, indeed. 

我知道这也许是不够明确。随时问我你的问题,以便我可以帮助你来帮助我。

在此先感谢! =)

+0

你可以在.NET 3.5中使用AccountManagement命名空间吗?这可能会使你试图写入的代码变得不必要。 – tvanfosson 2010-07-12 19:10:31

+0

您的“简化代码示例”可以使用更简单的一点。尝试削减代码,以便仅说明您想要讨论的模式。你的示例中有很多无关细节(例如FindProperties()等)。 – Karmastan 2010-07-12 19:12:11

+0

不幸的是,我不允许使用.NET 3.5,尽管我会喜欢它,因为我可以使用Bart de Smet的LINQ-to-AD库。 =)谢谢你的建议! – 2010-07-12 19:14:25

回答

1

对于同一个实例的 IDirectorySource,你会需要调用一个方法使用不同类型(如ToList)?

如果没有,那么留下IDirectorySource通用的方法(ToList)非通用将作出更清晰的代码,允许从IDirectorySource子类来实现自己的感知类型的逻辑对象。

+0

@Ed Noepel:谢谢!这也是我的想法,但有些时候,一旦在平底锅里,我们甚至无法看到我们面前。这有助于。 =) – 2010-07-13 04:30:10