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(就整个系统的身份而言)。作者声明索引器是为了强调存储库应该模拟内存中的对象集合。所以我的问题是:将索引器放在接口中有什么好处吗?任何链接,视频,书籍,教程都会对我有所帮助。谢谢。
答案 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>
...
像集合一样工作并不意味着看起来像集合 ......