模式使用EntityFramework?
-
22-07-2019 - |
题
什么是替代性的模式的使用对于实体的框架?
一些我知道的是:
"普通"EntityFramework-aka统一的工作
using (Data.Model c = new Data.Model()) { var z = c.Users.Where(x=>x.Name=='John'); }
储存库的图案
//Model implements IRepository User user = Model.Instance.Get<User>(u => u.Name == "John");
- 还有什么?
- ?
解决方案
一个很好的书,看看是马丁*福勒的 "模式的企业应用程序建筑".
在那里,他去过一些模式,用于检索/映射数据,如交互单元的工作、存储库的模式等等。也许事情可能是有用的,在一起的实体的框架。我得看一看。
其他提示
我的回答你的问题依据的假设是,你正在使用的实体的框架,直接在你的UI/控制/服务。
它已经证明,采用任何奥姆,inclusing EF,直接在你的UI/控制/服务,将引起很多问题中的未来。最重要的是,它使得很难,如果不是不可能的,单元的测试应用程序。
第二种办法即"模式实现的储存库"也是错误的,在我看来,因为模型和Respositories有不同的她还担任并根据"单一的责任"的一部分的固体原则不应合并这两个概念在一起。甚至如果你想要使用活性对象的图案模型中,我建议不要,你必须将模型从奥姆你使用。
最好的和最最推荐的解决方案是有一个接口等IRepository或IRepository与非常基本的成员作为模式的建议。是这样的:
Interface IRepository<T> where T:class
{
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
// if you don't want to return IQueryable
T FindById(object id);
IEnumerable FindXXXXX(params)
// if you prefer to return an IQueryable
IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}
注意到一些永世相信存储库不应该返回IQueryable.此外,还可以考虑使用ISpecification而不是表现形式和lambda。
你会需要实现IRepositoy口大部分的实体。使用这种方法还可以嘲笑你的存储库中的时候写的单元测试。在生产,将需要使用一个Ioc提供诸如团结,而,林夫,Catsle等。你也可以受益于微软公共服务定位执行避免联结到一个特定的IoC框架。
在老天,我曾有一个数据接口,这是impleneted用于特定业务领域或服务。其中一个问题与这种做法是,你将结束与重复代码不同的数据访问的服务如果你跟踪你的源代码,你会最终。
我们利用代码类似于什么你在你的单元的工作的例子。
我们做什么,除了是地图象数据传送对象。
有许多的文章上的问题,但该清单将减少基本上如果你想要一个很好的一个。 这篇文章从MSDN杂志 是相当好的,尽管它专门处理n层的应用。但因为你不说什么你在建筑的,也许它会帮助。
皇宫2SQL可以替代。这是一篇文章 依赖关系注入团结和皇宫SQL DataContexts