我必须开发一个相当大的asp.net mvc项目非常迅速,我想得到一些关于我的dal设计的意见,以确保不会回来咬我,因为bl可能变得相当复杂。一点背景知识:我正在使用一个oracle后端,这样内置的linq to sql就退出了;我还需要使用生产级库,这样oracle ef provider项目就退出了;最后,我无法使用任何gpl或lgpl代码(apache、ms-pl、bsd都可以),所以nhibernate/castle项目就退出了。我宁愿——如果可能的话——避免把钱花出去,但我更关心实施正确的解决方案。总而言之,我的要求如下:
Oracle后端
快速发展
(l)无GPL
免费的
我对数据集相当满意,但是使用pocos作为数据集和视图之间的中介会让我受益匪浅。谁知道呢,也许在某个时候另一个dal解决方案会出现,我会有时间把它关掉(是的,对)。因此,虽然我可以使用linq将数据集转换为iqueryable,但我希望有一个通用的解决方案,这样就不必为每个类编写自定义查询。
我现在正在思考,但同时我有两个问题:
这个解决方案有什么我忽略的问题吗?
有没有其他方法可以将数据集转换为poco?
提前谢谢。
最佳答案
没有正确的答案,尽管你会找到那些试图给你答案的人。需要记住的一些事情:
因为您无法获得ef或linq to sql的优势,所以不用担心使用iquerable接口;您不会获得它的主要优势。当然,一旦你有了你的poco,linq to object将是一个很好的处理方式!许多存储库方法将返回IQueryable<yourType>
。
只要您有一个好的repository来返回您的poco,首先使用反射来填充它们是a good strategy。如果你有一个封装良好的存储库,我再说一遍。您可以随时切换出反射填充的实体对象代码以获得更高效的代码,而bl中的任何东西都不会知道这一区别。如果你让自己依赖于直截了当的思考(而不是像nhibernate那样optimized reflection),你可能会后悔后来的低效。
我建议调查一下T4 templates。几个月前,我第一次从t4模板生成了实体类(以及填充它们并持久化它们的所有代码)。我被卖了!我的t4模板中的代码在第一次尝试时非常糟糕,但它会吐出一些很好的、一致的代码。
您必须为存储库方法制定一个计划,并密切监视您的团队创建的所有方法。你不能有一个通用的.GetOrders()
方法,因为它每次都会得到所有的客户,然后你的linq to对象看起来会很漂亮,但是会覆盖一些不好的数据访问!有像.GetOrderById(int OrderID)
和.GetOrderByCustomer(int CustomerID)
这样的方法。确保返回实体的每个方法至少在数据库中使用索引。如果基本查询返回一些浪费的记录,那没关系,但它不能执行表扫描并返回数千条浪费的记录。
例如:
var Order = From O in rOrders.GetOrderByCustomer(CustID)
Where O.OrderDate > PromoBeginDate
Select O
在本例中,将检索客户的所有订单,只是为了获取一些订单。但是不会有大量的浪费,而且customerid应该是订单上的索引字段。您必须决定这是可接受的,还是作为新方法或重载其他方法向存储库添加日期区分。这是没有捷径的;您已经在效率和维护数据抽象之间走了一条线。您不希望在存储库中为整个解决方案中的每个数据查询都有一个方法。
最近的一些文章我发现人们在为如何做到这一点而绞尽脑汁。
http://mikehadlow.blogspot.com/2009/01/should-my-repository-expose-iqueryable.html
http://www.west-wind.com/WebLog/posts/160237.aspx