【发布时间】:2011-03-14 23:16:08
【问题描述】:
我正在编写一个通用类型来处理底层 Active Directory 对象,例如组、组织单位和用户。
我还在我的通用接口中使用“手动”依赖注入。我想知道,在我的情况下,哪个更合适:泛型接口还是泛型方法?
这里有一个简化的代码示例向您展示:
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> 类提升为public。所以我只需要像这样声明一个来源:
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 命名空间吗?这可能会使您尝试编写的代码变得不必要。
-
您的“简化代码示例”可以使用更多的简化。尝试减少代码,使其仅说明您要讨论的模式。您的样本中有很多无关的细节(例如 FindProperties() 等)。
-
不幸的是,我不能使用 .NET 3.5,尽管我非常喜欢它,因为我可以使用 Bart de Smet 的 LINQ-to-AD 库。 =) 不过感谢您的建议!
-
@Karmastan:感谢您的评论。我会让它变得更简单。
标签: .net generics visual-studio-2005 interface dependency-injection