我在写一个通用类型来处理底层的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.
我知道这也许是不够明确。随时问我你的问题,以便我可以帮助你来帮助我。
在此先感谢! =)
你可以在.NET 3.5中使用AccountManagement命名空间吗?这可能会使你试图写入的代码变得不必要。 – tvanfosson 2010-07-12 19:10:31
您的“简化代码示例”可以使用更简单的一点。尝试削减代码,以便仅说明您想要讨论的模式。你的示例中有很多无关细节(例如FindProperties()等)。 – Karmastan 2010-07-12 19:12:11
不幸的是,我不允许使用.NET 3.5,尽管我会喜欢它,因为我可以使用Bart de Smet的LINQ-to-AD库。 =)谢谢你的建议! – 2010-07-12 19:14:25