我在linq to sql中使用存储库模式,在每个表中使用存储库类。
我想知道,我是否正在以良好/标准的方式做事,
联系资料库
Contact GetByID()
Contact GetAll()
COntactTagRepository
List<ContactTag> Get(long contactID)
List<ContactTag> GetAll()
List<ContactTagDetail> GetAllDetails()
class ContactTagDetail
{
public Contact Contact {get;set;}
public ContactTag COntactTag {get;set;}
}
当我需要联系人时,我在contactrepository中调用方法,与contacttag相同
但是当我需要联系人和标签时,我在ContactTag存储库中调用GetDetais(),它没有返回由orm生成的COntactTag实体,却插入了由返回的ContactTagDetail实体(包含由orm生成的COntact和COntactTag),我知道我可以在COntactTag中简单地调用GetAll存储库并可以访问Contact.ContactTag,但由于它是sql的linq,因此在查询级别将没有“延迟加载”的选项,因此,每当我需要具有相关实体的实体时,我都会创建一个投影类
另一个疑问是,我真正需要在哪里实现我可以在contact&ContactTag重新发布中使用的方法,例如在联系人存储库GetALlWithTags()或其他什么方法中,但是我在COntactTag存储库中做到了
您有什么建议?
最佳答案
我没有时间详细介绍,但基本上在表和存储库之间没有一对一的关系。我犯了那个错误,但它不起作用。相反,让您的存储库包含概念上相关的所有表。在您的情况下,只需拥有一个同时处理Contacts和ContactTags(以及任何其他相关表)的Contact存储库。关于“相关”的含义没有任何规则,只有您可以决定-但要根据对应用程序元素自然组合的理解来决定您的决定。
还可以阅读关于SO的两个线程,它们处理类似的问题:
Multiple or Single Repositories with LINQ和How to use the repository pattern correctly?