我必须非常快速地开发一个相当大的 ASP.NET MVC 项目,并且我想获得一些关于我的 DAL 设计的意见,以确保不会有任何问题困扰我,因为 BL 可能会变得相当复杂。一些背景知识:我正在使用 Oracle 后端,因此内置的 LINQ to SQL 已不再可用;我还需要使用生产级库,因此 Oracle EF 提供程序项目已退出;最后,我无法使用任何 GPL 或 LGPL 代码(Apache、MS-PL、BSD 都可以),因此 NHibernate/Castle 项目已经退出。如果可能的话,我宁愿避免花钱,但我更关心实施正确的解决方案。总结一下,我的要求是:
- 甲骨文后端
- 快速发展
(L)无 GPL
Free
我对 DataSet 相当满意,但使用 POCO 作为 DataSet 和视图之间的中介会让我受益匪浅。谁知道呢,也许在某个时候另一个 DAL 解决方案会出现,我会有时间将其切换掉(是的,没错)。因此,虽然我可以使用 LINQ 将数据集转换为 IQueryable,但我希望有一个通用的解决方案,这样我就不必为每个类编写自定义查询。
我现在正在修改反思,但同时我有两个问题:
- 这个解决方案是否存在我忽略的问题?
- 您是否建议使用其他方法将数据集转换为 POCO?
提前致谢。
没有correct答案,尽管你会找到愿意给你答案的人。需要记住的一些事情:
由于您无法获得 EF 或 Linq-to-SQL 的优势,因此不必担心使用 IQuerable 接口;你不会得到它的主要优势。当然,一旦您获得了 pocos,LINQ to object 将是处理它们的好方法!您的许多存储库方法都会返回IQueryable<yourType>
.
只要你有一个好的存储库 http://martinfowler.com/eaaCatalog/repository.html要返回你的 pocos,使用反射来填充它们是一个好的策略 http://www.simple-talk.com/dotnet/.net-framework/a-defense-of-reflection-in-.net/, 首先。If我再说一遍,你有一个封装良好的存储库。您可以随时将反射填充的实体对象代码切换为更高效的代码,并且 BL 中的任何内容都不会知道其中的差异。如果你让自己依赖的直接反射(不优化反射 http://darioquintana.com.ar/blogging/2008/07/24/nhibernate-how-much-slow-because-the-use-of-reflection/像 nHibernate),稍后你可能会后悔效率低下。
我建议调查一下T4模板 http://visualstudiomagazine.com/articles/2009/05/01/visual-studios-t4-code-generation.aspx。几个月前,我第一次从 T4 模板生成实体类(以及填充它们并持久化它们的所有代码)。我被卖了!我的 T4 模板中的代码第一次尝试非常糟糕,但它会输出一些内容nice,一致的代码。
您必须为存储库方法制定计划,并密切监视团队创建的所有方法。你不能有将军.GetOrders()
方法,因为它会得到all每次都会访问客户,然后您的 LINQ to 对象看起来会很好,但会覆盖一些错误的数据访问!有类似的方法.GetOrderById(int OrderID)
and .GetOrderByCustomer(int CustomerID)
。确保返回实体的每个方法至少在数据库中使用索引。如果基本查询返回some浪费记录,没关系,但它不能进行表扫描并返回数千浪费的记录。
一个例子:
var Order = From O in rOrders.GetOrderByCustomer(CustID)
Where O.OrderDate > PromoBeginDate
Select O
在此示例中,将检索客户的所有订单,只是为了获取some的订单。但不会造成大量浪费,并且 CustomerID 当然应该是 Orders 上的索引字段。您必须决定这是否可以接受,或者是否将日期区别添加到您的存储库中,无论是作为新方法还是重载其他方法。这没有捷径;您已经在效率和维护数据抽象之间找到了平衡。您不希望在存储库中为整个解决方案中的每个数据查询提供一个方法。
我发现最近的一些文章中人们正在努力思考如何做到这一点。:
- http://mikehadlow.blogspot.com/2009/01/should-my-repository-expose-iqueryable.html http://mikehadlow.blogspot.com/2009/01/should-my-repository-expose-iqueryable.html
- http://www.west-wind.com/WebLog/posts/160237.aspx http://www.west-wind.com/WebLog/posts/160237.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)