Fre*_*ood 8 .net c# entity-framework repository-pattern entity-framework-ctp5
我只想知道编写存储库方法的最佳实践.问题是决定编写上下文没有延迟加载的存储库.如果它是GetById,你如何命名你的方法,但不清楚导航包含在实体中.
所以我想编写像GetUserByIdIncludedPosts这样的方法名称或者最好使用延迟加载激活的上下文?
如果我在方法名称中编写包含的属性,那么对于很少的导航属性来说,这将是非常烦人的长方法名称
使用存储库模式并不意味着您将无法使用延迟加载。您仍然可以返回能够延迟加载其相关实体的实体。唯一的要求是DbContext用于加载的实体必须是“活动的”。
但让我们看一下Martin Fowler对存储库的定义:
存储库在域和数据映射层之间进行中介,其作用类似于内存中的域对象集合。客户端对象以声明方式构造查询规范并将其提交到存储库以获得满足。可以在存储库中添加和删除对象,就像从简单的对象集合中添加和删除对象一样,存储库封装的映射代码将在幕后执行适当的操作。从概念上讲,存储库封装了数据存储中保存的一组对象以及对它们执行的操作,从而提供了持久层的更加面向对象的视图。存储库还支持在域和数据映射层之间实现完全分离和单向依赖的目标。
我认为有趣的部分是:客户端对象以声明方式构造查询规范并将其提交到存储库以获得满足。存储库通常用于提供聚合根。因此,您要么始终提供整个根(并不总是可能),要么满足上述语句,并且您将通过Include上的扩展方法在存储库外部定义急切加载IQueryable。因此,您永远不需要像GetUserByIdIncludeSomething.
如果您想使用存储库开始对所有查询使用此方法:
public interface IRepository<T>
{
IQueryable<T> GetQuery();
}
Run Code Online (Sandbox Code Playgroud)
顺便提一句。我不认为用户是帖子的聚合根。在这种情况下,大多数应用程序将只有一个聚合根 - 用户。
编辑:
小澄清:IQueryable默认情况下不提供Include方法。它在 CTP5 程序集中作为扩展方法提供,但如果您使用它,您将使上层依赖于 EntityFramework.dll。这是您通常不想要的东西(您使用存储库的原因)。因此,正确的方法是定义您自己的扩展方法,将提供的扩展包装在您的存储库中。