通用接口VS泛型方法?

时间:2010-07-12 19:05:53

标签: .net generics visual-studio-2005 interface dependency-injection

我正在编写一个通用类型来处理基础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.

我知道这可能还不够清楚。随意问我你的问题,以便我帮助你帮助我。

提前致谢! =)

1 个答案:

答案 0 :(得分:1)

对于 IDirectorySource 相同实例,您是否需要使用不同类型调用方法(例如 ToList )?

如果没有,那么保留 IDirectorySource 泛型和方法( ToList )nongeneric将使代码更清晰,允许从 IDirectorySource 子类化的对象实现自己的类型感知逻辑。