【问题标题】:Generic interface VS generic method?泛型接口VS泛型方法?
【发布时间】: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&lt;T&gt; 类提升为public。所以我只需要像这样声明一个来源:

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

所以我可以检索组列表:

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

但是我想知道我是否应该让我的IDirectorySource&lt;T&gt; 接口通用,或者让它非通用并让我的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


【解决方案1】:

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

如果不是,那么将 IDirectorySource 保留为泛型而方法 (ToList) 为非泛型将使代码更简洁,允许从 IDirectorySource 子类化的对象实现自己的类型感知逻辑。

【讨论】:

  • @Ed Noepel:谢谢!我也是这么想的,但有时,一旦在平底锅里,我们甚至都看不到我们面前。这有帮助。 =)
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多