题
我很困惑,在库被定义什么,什么留下来服务的限制。如果存储库中只能创建简单的实体从数据库匹配表,也可以创建复杂的自定义对象与这些实体的组合?
换句话说:如果服务是制造各种LINQ到SQL查询的信息库?还是应该所有的查询中的预定义的在库和业务逻辑简单地决定调用哪个方法?
解决方案
您已经实际募集这里的一个问题,因此目前产生了很多的讨论在开发者社区 - 见后续评论的应该我的库暴露的IQueryable?
在仓库可以 - 并应该 - 创建包含多个相关联的实体的复杂组合的对象。在域驱动设计,这些被称为的聚集体强> - 组织成一些内聚结构相关联的对象的集合。您的代码不必单独调用 在一方面,有一个令人信服的理由是LINQ到SQL对象,与他们的“智能”特性及其延迟执行(即不加载Customer.Orders,直到你真正使用它)是的一个完全有效的实现库模式,因为你没有实际运行的数据库代码,您正在运行LINQ语句(然后由底层的LINQ提供程序翻译成DB代码) 在另一方面,马特布里格斯后指出,L2S是相当紧耦合到您的数据库结构(如表一类),并有一定的局限性(没有多对多的映射,例如) - 你可能会更好断使用L2S为GetCustomer()
,GetOrdersForCustomer()
,GetInvoicesForCustomer()
- 你只需要调用myCustomerRepository.Load(customerId)
,你得到一个深刻的客户对象与已实例化的属性。我还要补充一点,如果你是基于特定的数据库表返回单个对象,那么这是一个非常有效的方法,但它不是真正本身的存储库的 的 - 它只是一个数据访问层<。 / p>
其他提示
一个仓库应该是唯一一件你的应用程序,它知道你的数据访问技术什么。所以它不应该返回由L2S生成的所有对象,但映射这些属性来模拟你自己的对象。
如果您正在使用这种模式,你可能要重新思考L2S。它为您生成一个数据访问层,但并没有真正处理阻抗不匹配,你必须这样做手工。如果你看看像NHibernate的,这映射是在一个更强大的方式进行。 L2S是更对于2层应用程序,要在其中一个快速和肮脏DAL,你可以很容易地扩展上。
如果你使用LINQ然后我的信念是,库应该是你的LINQ语法的容器。这使你从你的模型对象接口的数据库访问例程的一个抽象层。正如迪伦提到上面有对此事的其他视图,有些人喜欢返回的IQueryable,使他们能够继续在库后,稍后查询数据库。没有什么错这些方法的执行,只要你在你的标准,你的应用程序明确。 有对我用的最佳做法的详细情报这里LINQ库。