Ras*_*sto 20 .net asp.net-mvc entity-framework repository repository-pattern
存储库模式用于从特定数据库和对象关系映射技术(如EF)中抽象使用.因此,如果我决定这样做,我可以在将来轻松替换(例如)我的实体框架映射与Linq to SQL.
但是当我使用EF时,我从模型中获得了我的实体类 - 也就是说它们是从该可视化图中生成的.如果我在我的存储库中使用这个生成的实体类,然后决定用其他东西替换EF,那么我将删除那个可视化实体图,这也意味着删除类吧?
我要解决的问题是我的存储库将依赖于实体框架,即数据访问层,因为它将使用EF生成的类.
如何删除此依赖项?
另请注意,我使用EF主要是因为它能够从该可视化图生成所有内容 - 我只是设计图表并让它为我生成所有外键等数据库.我非常喜欢,甚至不想想想SQL命令.
Lad*_*nka 28
存储库始终依赖于数据访问技术.这就是人们使用存储库的原因 - 将数据访问依赖性包装到单独的层.如果您决定更改数据访问技术(例如,您有1%的可能性),则必须创建新的存储库,以实现与以前相同的接口.
引入repositoris将增加一层新的复杂性.存储库有其优点和缺点.引入它们只是因为"你可以在将来改变数据访问方法"是一个不好的理由.不要因为可能发生的事情而设计您的应用程序.根据当前的实际需求(敏捷方式)设计应用程序,并在需要更改时重构代码 - 这是如何在市场中保持竞争力的唯一方法.功能是出售您的SW而不是其开放式架构用于任何类型的更改(好的,有例外但在这种情况下开放式架构是顶级要求).
使用EF时,您有多种选择如何创建实体:
如果您希望将来可以更改数据访问技术,请使用POCO的第二种或第三种方法.对于T4模板,您只需复制生成的POCO或修改项目文件,这样在删除EDMX文件后就不会丢失它们.
如果您不确定第二种或第三种方法是否适合您,请检查我对这些问题的回答:
因为我在某种程度上同意@Patko的回答,你也应该查看Ayende的博客.他撰写了几篇关于使用存储库和架构应用程序的文章.他正在撰写关于NHibernate的文章,但可以用EF做出类似的解决方案.唯一的区别是NHibernate提供了更好的抽象,因此直接使用NHibernate的代码更易于测试.
能够从一个持久性技术切换到另一个持久性技术很好,但是你真的需要它吗?
首先,什么是存储库?根据Fowler的定义,它提供了对域对象的内存中集合访问.但是每个现代ORM工具都已经这样做了,因此另一层抽象只会增加一点复杂性.
其次,从一种持久性技术切换到另一种持久性技术通常比提供另一种存储库实现更复杂.例如,您打算如何处理交易?事务通常依赖于上下文并在存储库之外处理.您当然可以使用某种工作单元实现,但是您必须为每种持久性技术实现新的工作单元.
我并不是说你不应该使用存储库,只是可能再考虑一下.
由EF的设计者创建的实体类存在于您的项目中,位于"Model.Designer.cs"中.您可以复制代码,以便即使从EF删除模型或引用,您的实体仍保留在项目中.但是,它们与EF紧密耦合,因此您应该努力将EF与实体类分离.
到目前为止,你有T4模板可以帮助你解耦,但他们仍然需要对所选T4进行一些更改:
EF4.1带来了一个简化的API DbContext,当您想要解耦实体类时,它可以改善您使用EF的体验.使用EF4.1,您可以获得3种方法:
现在,回答你的问题:
如何删除此依赖项?
了解如何在此处完成所有这些:EF 4.1模型和数据库第一次演练.
您应该阅读ADO.NET团队博客中的系列 文章在EF Feature CTP5第1部分:简介和模型 (EF4.1以前称为EF Feature CTP5)中使用DbContext.
您可以在我的问题中获得更多详细信息:仅限EF POCO代码VS EF POCO和实体数据模型.
归档时间: |
|
查看次数: |
12227 次 |
最近记录: |