我正在编写一个通用类型来处理基础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.
我知道这可能还不够清楚。随意问我你的问题,以便我帮助你帮助我。
提前致谢! =)
答案 0 :(得分:1)
对于 IDirectorySource 的相同实例,您是否需要使用不同类型调用方法(例如 ToList )?
如果没有,那么保留 IDirectorySource 泛型和方法( ToList )nongeneric将使代码更清晰,允许从 IDirectorySource 子类化的对象实现自己的类型感知逻辑。