复合DAL - >使用AutoMapper进行BL映射

时间:2010-10-10 20:38:37

标签: .net architecture automapper automapping

我正在考虑在即将开展的项目中使用AutoMapper并试图找到可能的“瓶颈”。目前,我能想象的最复杂的案例如下: 一个域类,由数据库中的3个(例如)表表示(我的数据访问层是LINQ to SQL)。要构建类的实例,我需要执行3个查询:

  1. 从表A中选择ID(1行,直接转到Class属性)
  2. 从表B中选择ID(0..1行,转到可选的Class.Code属性)
  3. 从表C中选择ID(0..N行,转到Class.Parameters集合)
  4. 我不确定如何配置映射。以下是我考虑的选项:

    1. 执行3次查询并映射Tuple<A,B,C> - &gt; Class
    2. 使用外部联接(更有效)组合查询1和2。但是我如何处理匿名类型?
    3. 将datacontext注入映射,定义A - &gt; Class映射并让类型转换器完成工作吗?
    4. 没有看起来像是胜利。你会建议什么?

      编辑:嗯,这种复杂的情况非常罕见(10-20%),我可以手动完成,剩下的80-90%使用AutoMapper就好了。但是我想知道AutoMapper是不是为这样的策略而设计的,或者我错过了一些重要的东西。

2 个答案:

答案 0 :(得分:2)

您的问题很难回答,因为域对象获取其数据的方式和位置不是AutoMapper的关注点。来自AutoMapper documentation

  

AutoMapper面向模型   投影场景趋于平缓   DTO和DTO的复杂对象模型   其他简单的物体,其设计是   更适合序列化,   沟通,消息,或简单地   反腐败层之间   域和应用层。

但是,这并不意味着您对AutoMapper的使用不应该考虑到域对象背后的思考过程。作为一个例子,懒惰的装载让人想起。例如,在您的情况下,如果您在Class.Parameters属性上使用延迟加载,但随后通过AutoMapper运行该属性,则始终会加载数据。这就是坚持one model per view的规则很重要的原因。

Automyper的创建者之一Jimmy Bogard讨论了他对AutoMapper: the Object-Object Mapper中AutoMapper的看法。我希望我可以直接链接到它,但在上述博格德的评论回复中说:

  

这是我们一直在寻找的东西   虽然(双向绑定),但在   最后,我们发现也有   更新中的大量业务验证。

     

相反,我们形成了其他模式   从a更新模型   消息/形式。请参阅Code Camp Server   来源了解更多详情。

如上所示,您可以在CodeCampServer的源代码中发现大量使用AutoMapper。可以在source code提供的ASP.NET MVC 2 in Action中找到CodeCampServer代码的简化版本。

答案 1 :(得分:1)

这应该是一个判断对象模型的判断决定。

优点:

  • 如果类直接映射到实体并且类属性名称与table.columnname匹配,则Automapper很好。
  • Automapper无缝地映射集合。
  • 您可以创建自动映射配置文件并验证配置。
  • 您可以在应用程序级别拥有一个日期时间,资金等格式化程序。
  • 您可以选择使用空白或任何想要的字符填充NULL。
  • Ignore()在很多情况下派上用场。

缺点:

  • 映射中的异常有时很难调试。
  • 如果有许多解析器,您的代码看起来很混乱。
  • 在复杂的对象结构中,您可以解决几个类的直接映射问题。因此不会保持一致。