![]() |
1
2
不是我正确理解问题,而是为了解决重复的类,您可以使用 AutoMapper . 请注意,您可以声明性地应用映射或使用反射,即半自动应用映射。例如参见 here -这与数据层无关,但显示了简单属性如何有助于自动映射。在这种情况下,MVC应用属性,但您可以发明自己的引擎来查找[实体(“订单”)]属性并应用automaper。 而且,你不能只使用“几行”就拥有100%的持久性独立性。ORM选择在这里起着重要作用。例如,linq-to-sql不能使用普通类(poco),因此重新使用它们不像使用nhibernate那样容易。使用存储库,您将在数据层中有许多查询;不同的ORM通常具有不同的查询语法或实现(甚至LINQ并不总是在ORM之间兼容),因此切换数据访问可能是完全替换数据层的问题,这不是几行(除非您的应用程序是“hello,world!”). 上面的automaper解决方案实际上是一种自焙的形式。所以您可能需要考虑一个更好的ORM来满足您的需求?为什么不使用EF4,特别是考虑到它现在支持POCO,并且与LINQ to SQL非常相似,至少在查询语言中如此? |
![]() |
2
5
欢迎来到松散耦合代码的美丽而激动人心的世界:) 您正确理解这个问题,但首先让我重申一下您已经暗示的内容:域模型(即所有域类)必须独立于任何特定的数据访问技术进行定义,因此您不能使用自动生成的Linq to SQL(L2S)类作为域类的基础,原因很简单,您不能真正地将它们与其他技术一起重用(正如您在基于JSON的存储库中发现的那样)。 每个域对象的接口甚至都不会帮助您,因为为了避免贫乏的域模型,您需要在域类中实现行为(并且您不能将行为放入接口中)。 这意味着要对域对象进行水合物和脱水,必须有一些映射代码。它一直是这样的:在过去,我们必须从IDataReader实例映射到域类,而现在我们需要从数据(L2S)类映射到域类。 我们能要更好的吗?对。我们能得到更好的东西吗?可能。实体框架的下一个版本将支持对持久性的忽略,原因正是这样的:您应该能够将域模型定义为POCO,如果您提供了一个映射和一个数据库模式,那么EF将负责其余的部分。 在那之前,微软没有提供这种功能的任何东西,但是NHibernate有(注意:我没有NHibernate的经验,但是很多聪明人说这是真的,我相信他们)。这是很多人比英孚更喜欢NHiberiate的一个主要原因。 松耦合需要大量的映射,所以我只能附和queen3的建议,在这种繁琐的工作中使用automapper。 最后,我想指出一个相关的问题:映射并不一定意味着违反dry。最好的例子是当涉及到对应于给定域对象的强类型视图模型时。不要被语义相似性愚弄。他们可能或多或少地拥有相同的财产和相同的价值,但他们的责任相差很大。随着应用程序的增长,您可能会体验到这里和那里潜藏的细微分歧,并且您会很高兴您的关注分离-即使它最初看起来像很多重复的工作。 在任何情况下:松耦合在开始时都要做更多的工作,但它将使您能够继续开发一个应用程序,在这个应用程序中,紧密耦合的应用程序很早以前就会冻结在维护地狱中。你要做的是长期的工作,但那不是即时的满足。 |
![]() |
Andrus · 如何在Linux中阅读期刊 5 月前 |
![]() |
Miranda · 读取xml文件时路径错误中有非法字符 5 月前 |
![]() |
Vengat Ramanan · 用户登录Asp时隐藏导航和页脚。网络核心 10 月前 |
![]() |
s15199d · mvc MapController路由/类别名称在这里 11 月前 |
![]() |
Primdonm · 如何将自定义列表中的字符串值格式化为货币格式? 1 年前 |
|
Kiryl · Sitecore中自己的控制器 1 年前 |
|
Farid · 如何从数据库中填充Resource.resx文件值? 1 年前 |