Entity framework 4 实体框架4和存储库模式
有人能解释一下使用这种模式的好处吗 我的意思是EF在某种意义上已经是一个存储库了吗?你不能直接查询容器并返回那些对象吗 我看到很多关于POCO、AutoMapper、依赖注入、服务层和IoC的讨论。我只是把一堆东西混在一起,还是一切都有关联 有人能给我解释一下吗 另外,这一切如何与MVC.net、ViewModels和DataModels相结合 谢谢,Entity framework 4 实体框架4和存储库模式,entity-framework-4,dependency-injection,repository-pattern,poco,Entity Framework 4,Dependency Injection,Repository Pattern,Poco,有人能解释一下使用这种模式的好处吗 我的意思是EF在某种意义上已经是一个存储库了吗?你不能直接查询容器并返回那些对象吗 我看到很多关于POCO、AutoMapper、依赖注入、服务层和IoC的讨论。我只是把一堆东西混在一起,还是一切都有关联 有人能给我解释一下吗 另外,这一切如何与MVC.net、ViewModels和DataModels相结合 谢谢, Sam这里有一堆随机问题,所以我将给出一堆随机答案: (Martin Fowler)将存储库定义为“使用类似集合的接口在域和数据映射层之间进行
Sam这里有一堆随机问题,所以我将给出一堆随机答案:
- (Martin Fowler)将存储库定义为“使用类似集合的接口在域和数据映射层之间进行中介,以访问域对象”
- EF是一个ORM,它是数据映射层
- 是的,您可以查询EF容器并返回对象,但是消费者“知道太多”底层持久性机制,而它不应该知道/关心-因此是存储库模式
- POCO是一种用于将对象从持久性元数据中释放出来的技术(默认情况下使用EF code gen)。它们还允许您的POCO兼作您的域模型
- 视图模型由MVC视图使用
- AutoMapper用于轻松地将视图模型转换为域模型
- 服务层在控制器和存储库之间提供了一个中间地带-专门用于
存储库,将查询具体化为具体序列(例如IQueryable
)李>ICollection
- IoC用于消除组件之间的依赖关系,这提供了一个良好/干净的体系结构和最高的可测试性(您可以通过模拟存储库将其传递给控制器,以隔离的方式对其进行单元测试)
public class ProductsController
{
public ActionResult GetProduct(int productId)
{
Product p;
using (var ctx = new MySecretContextWhichIsNowExposed())
{
p = ctx.Products.SingleOrDefault(x => x.ProductId == productId);
}
return View(p);
}
}
上述问题:
MockProductRepository
,并完成它(可以作为内存列表实现)@RPM1984-您能否详细说明#3:italic#是的,您可以查询EF容器并返回对象,但是消费者对底层持久性机制“知道得太多”,而它不应该知道/关心—因此是存储库模式_italic@RPM1984-所有这些技术都相关吗?@Sam Striano-是的,它们都有关联。但是有些不是特定于.NET的(POCO的-Java有POJO的,DI/IoC是一个通用的编程原则,存储库/服务层也是如此)。@RPM1984-存储库代码在哪里?在与EF相同的组件中?你能给我举一个分层方法的例子吗?@Sam Striano-这涉及太多,无法给出一个例子,我建议你有一个谷歌“ef4存储库poco”。但是是的,它应该与EF-a“MyCompany.Project.Data”程序集位于同一程序集中。
public class ProductsController
{
private readonly IProductsRepository _repo;
public ProductsController(IProductsRepository repo)
{
_repo = repo;
}
public ActionResult GetProduct(int productId)
{
Product p = _repo.FindById(productId);
return View(p);
}
}