返回首页


你还在使用

using (DBContext context = new DBContext())

{

  ..

}


的方式访问数据库?我的意思是很酷,至少你确定你没有连接池的惩罚。但如果你写这个代码呢?你有一个数据访问层?以外使用块访问的导航属性如何?如何确保开发人员不会忘记上下文限制和试图访问上下文相关的表外?我见过开发商没有使用块创建上下文联,然后处理它没有打扰,离开这个"猴子业务??垃圾收集器。因为它是用了很多的访问,我自告奋勇来解决这个问题,并封装在所有上下文中使用块Web服务项目。我没有刻意去测试它..我的意思是什么可以去错了,对不对?这是小牛。因为不幸事件的组合,代码中找到它的方式生活,并坠毁......有人在业务层使用导航属性。为什么它没有崩溃之前是垃圾收集器的唯一原因,它不处理的情况下,速度不够快,所以你仍然可以写一些在业务代码前的背景下被出售。实际上是一场与时间赛跑..
在接下来的项目,我最初的想法是让所有的导航属性在实体仅供内部使用的DAL。但随后凸轮建筑师建议我们使用LINQ从"基本法"的实体。这意味着实体框架内,必须继续在业务层(但不能访问); hesnbsp; existencenbsp。该如何解决?工作单位。
首先,我们创建数据访问层。作为一个概念的实体框架是由本身的DAL,但我们需要从我们的代码中分离出来,UT斯达康简单起见,因为它仅仅是一个很好的做法。这是很多简单的嘲笑比EF接口。里面DAL的项目,我们创造了所有的数据库访问工作的Repository类。实际上却只有CRUD操作。例如:{C}
你可能会说这是没有的CRUD因为没有更新操作。但因为客户是由客户的财产公开可更新资源库以外的任何人,所以它暴露的更新操作。
我跳过了你是不是愿意看到它的实施细则。所有的时间。让我们来看看这是什么CRUD操作给我们。我们有一个资料库,不具备前。 GetCustomerOwingMoney(),或GetNewOrders的()。从面向对象认为将是客户收集和订购集合上的操作点。它使SENS不写在我们的"基本法"。很好,让我们写上他们的IQueryablelt; Customergt;收集:
public IQueryable<Customer> OwingMoney(this IQueryable<Customer> customers)

{

  return customers.Where(x => x.Balance < 0);

}


嘿,这是一个扩展方法!我们遵循面向对象的方式和的OwingMoney()方法上了自己与客户的集合。是不是真棒吗?作为我们项目的一部分,我们创建所需的操作集合的所有实体的扩展方法(只是任何方法之前,作为一个扩展,首先想到的,如果这是一个有关"基本法"或it'a与特定类型的操作)。作为公约的扩展方法的类被称为CustomerExtensions,OrderExtensions等推进,向前,我们也有部分类像OwsMoney为实体的属性和方法,(前面的例子),或暂停()暂停客户如果他拒绝支付。因此,该扩展可以用来从一种流畅的方式,在"基本法"。
在这一点上可能出现的一个问题是什么??如果我们有这种扩展方法,并在部分班级的逻辑,我们实际上把在"基本法"?和确有不薄的边界扩展方法的结束和"基本法"开始。到目前为止,我们的规则是把所有的可重用的代码,在可能的情况下,扩展方法和局部类,其余的将是"基本法"。 例如,让我们的说,我们需要一个暂停所有客户,欠的钱到商店的方法,并有2个以上开放订单(我它没有,但只是为的样本为了逻辑),这可以被作为一个做扩展上IQueryablelt; Customergt;,但它不会被重用,任何地方,因为它是一个由一些预定的过程将触发的行动。因此,它使写在"基本法",它有很大的意义:{体C3}
这是否有意义?没有一个典型的资源库。至于我们没有保存更改。我们可以让它这样。它将被保存......最终。以及如何在世界上,我们处理的上下文?哦,我们说的UnitOfWork。
我开始讨论的UnitOfWork实施之前,我将假定您熟悉解释他们的依赖注入和控制反转是这个职位的范围。
,对于目前的职位,我会做一个非常简单的UnitOfWork只是为了满足一直坚持的HTTP请求的生命周期上下文的问题。更多complext的实施将意味着支持多个上下文,支持不同objectnbsp; persistencenbsp上的UnitOfWork。{的C4}
在这里,我们有2个上下文和另一个交易的属性。因为每个请求的行为,我们不能使用TransactionScope多,所以我们会去有位交易工作的老时尚方式。
下一步将配置IoC容器来对待IUnitOfWork一生,给一个HTTP请求的同一个实例。的意义,每当我会打电话给我的国际奥委会像{C5的}
我将同在一个HTTP请求(HTTP会话不被混淆)的UnitOfWork实例。
下一步是配置的Global.asax处理的UnitOfWork, committingnbsp;请求结束时,只处理它时,抛出一个异常,这样的交易将被回滚。你需要添加到Global.asax:{5233}
任何行动都需要在BeginRequest事件。但到目前为止,实体框架内的未初始化的任何地方。它将使意义仅在需要时初始化上下文。一些请求可能不会打DB额外的刑罚为何?因为我不想我的"基本法",以多了解外汇,我决定做库的初始化。我创建了1 getContext()方法返回上下文每当它需要。因为使用依赖注入的UnitOfWork可以在构造函数的参数被设置为当库被实例化(最好由IoC),它会被注入:{C7-}
我们几乎没有。只需要更新我们的CRUD操作例如,用的getContext():{C8的}
我们有。让我们来总结我们得到了什么。我们拥有的UnitOfWork是一类单身,那是使用IoC检索,只要是在相同的HTTP请求的情况下,将具有相同的实例。库中的第一DB操作时被称为上下文和事务的创建和保存上的UnitOfWork。上下文将被重用,因为它是做相同的HTTP请求的操作,只要在资料库。每当HTTP请求结束(一个HTTP的答复是颁发给客户端),在没有例外的情况下,交易将致力于和所有更改将被保存到数据库中,在异常情况下的交易将恢复和一个不错的消息发给最终用户,并应建立一个错误日志。另一个的UnitOfWork上的下一个请求创建和另一个上下文。
为商业层,我们有安全的访问导航属性,扩展方法可用于任何实体。性能提高,因为"基本法"不访问ObjectContext的创建新的实例不同的动作库方法。
我一直在问,如果本身的背景下保持了这么久不是性能问题。答案应该是"??如果你正在建设一个网站,如Facebook,你可能会寻找其他选项(和最有可能放弃对英法)。池大小的情况下,有100的默认大小。这意味着你可以有100个并行处理的请求,101将等待一个方面是自由的。当你到100多个并行的请求,你可能会担心有其他瓶颈,将已经考虑负载均衡。
如果我可以回到问题的SaveChanges()。在所提出的例子,它永远不会被调用库或BL的例子是相当简单的。在更复杂的情况下,这将是必要的,所以在我们的实施中,我们有一个Save()方法,只需调用上下文的SaveChanges()库中的实施。这将是当你添加新的实体库,然后一个场景:当你需要做的(),并期望找到他们。嗯..如果你想吗?保存在哪里()操作前,你会不会..外汇基金是如何运作的。相同的变化。所以,如果你需要添加/更新的东西和使用,在未来的查询,首先做了保存。这一直是我最常见的错误之一??/ P>
我没有处理延迟加载的问题,在这篇文章中,因为它的范围之外,但,当你开始与EF的工作,并使用了很多的导航属性牢记这个问题。
NBSP了问题?

回答

评论会员:游客 时间:2012/02/04
Sazzad侯赛因:我同意奔。类似问题在全球范围内使用,我发现我的自我。如果您使用的是MVC的应用程序,我的做法是,把每个服务类中的背景和公开服务,国际奥委会通过任何控制器。基本服务将来自服务类,这将有一个受保护的Context属性。除了它是不是会像一个singleton对象上下文属性。上下文将被创建时,它被称为保持一个私人的对象的引用,即对象的水平。这样你仍然可以打开上下文产生,直到你认为你可以得到延迟加载,但一旦完成渲染和关闭连接控制器的范围,使服务类和背景。我知道它会创建为每个控制器动作的背景下,但你不使用使用(DBCtx)块保存。-----------------------------@SazzadHossain-----------------------------
拉杜・帕斯卡尔
评论会员:游客 时间:2012/02/04
喜奔,我看过你的文章,我得到了它的一些有趣的想法。延迟加载的想法,是一个开发人员编写糟糕的代码的原因,但我不能同意。这是奥姆斯(LINQ到SQL,实体框架),人们的工作,但从来没有打扰真正了解它们是如何工作的。和我知道你在说什么,我在我的球队有同样的问题。最好的事情你可以做的是找到最常见的错误,并做了关于如何避免它们的速成课程。它也有助于摆脱的最大问题。关于数据源分离,我想呼吁更大的文章(我写作的梦想)有关如何连接一切,从小牛到Web用户界面(桌面应用程序要简单得多)。当前文章可能过于集中只是一个方面......在我们的项目中,我们从来没有使用UI项目中。不连的实体的UI。在业务层和UI的之间我们有一个门面,地图上的所有域实体波苏斯大多以DTO的,,是那么的Web用户界面或(它是实际1更大的系统,网络是只有1它的一部分)等应用程序使用。因此,开发人员不必在Web项目中的任何访问。这是唯一的DAL知道有关背景。业务知悉的DAL。和UnitOfWork是一个库,可以保持上下文,并提交它,当UnitOfWork.Commit()被称为