通用接口中的索引器

时间:2015-12-19 16:43:44

标签: c# .net generics interface

public interface IRepository <T>  where T : EntityBase
{
    T FindBy(object key);
    void Add(T item);
    T this[object key] { get; set; }
    void Remove(T item); 
}

这是一个通用Repository接口的代码示例,该接口由本书作者#34; Domain-Driven-Design .NET C#&#34;提供。如果没有解释,作者会在接口T this[object key] { get; set; }中放置一个索引器,其中对象键是对象ID(就整个系统的身份而言)。作者声明索引器是为了强调存储库应该模拟内存中的对象集合。所以我的问题是:将索引器放在接口中有什么好处吗?任何链接,视频,书籍,教程都会对我有所帮助。谢谢。

3 个答案:

答案 0 :(得分:0)

在这种情况下,索引器用于检索给定键的对象(不是集合中的索引)。在System.Collections.Generic中的标准通用接口之外,IDictionary<TKey, TValue>是包含该功能的接口。但是,该接口包含许多未由存储库自然公开的功能。

当然,可以实现其他方法,但它们效率不高。提供非高效的API是邀请API用户编写低效代码的可靠方法。

答案 1 :(得分:0)

  

作者指出,索引器是为了强调存储库应该模拟内存中的对象集合而设置的。

这听起来像是一个合理的理由。通过&#34;强调&#34;,它指出一个重要方面:索引器不一定添加任何功能,它也可以简单地用于提高结果代码的可读性。

假设某个对象具有IRepository<Something>类型var theItem = myObject.Resources.FindBy(someKey); 的属性,没有索引器,则只能按如下方式检索特定项:

var theItem = myObject.Resources[someKey];

使用索引器,也可以使用以下内容:

index

在某种程度上,这是个人偏好的问题,但第二个版本可能更直观地可识别为仅仅从列表中检索,而不是任意参数化方法调用。

答案 2 :(得分:0)

  

将索引器放在界面中有什么好处吗?

这是主观的。如果您通过某些找到更有意义的定位对象,为什么不呢?

使用索引器时的主要问题是它们可能会过载。虽然你的界面定义了一个索引器,用于通过id 获取对象(其中 id object ...我会将对象id转换为泛型类型... ),遵循提议的模式,如果您定义的索引器不仅仅是通过其标识符检索域对象的索引器,则可能会失去索引器的含义。

例如:

T this[object key] { get; set; }
T this[T someObject] { get; set; }
T this[int whoKnowsWhatIsIntegerHere] { get; set; }

在一天结束时,您需要实施索引器,并且在正确实施存储库方面不会强调使用它们:存储库在域之间进行调解时很好和数据映射器将域对象转换为数据,反之亦然。。也就是说,它不是关于什么名称有他们的方法,或者他们是否看起来像IList<T> ...

像集合一样工作并不意味着看起来像集合 ......