【问题标题】:AutoMapper in the DAL: When to use Mapper.Reset()?DAL 中的 AutoMapper:何时使用 Mapper.Reset()?
【发布时间】:2011-09-15 23:26:58
【问题描述】:

我在生成的数据访问层中使用 AutoMapper。这很好用。在另一个层中使用 AutoMapper 并实现在 DAL 中创建的带有Mapper.CreateMap<T1, T2>() 的映射仍然存在时,这有点令人困惑。我看到Mapper.Reset() 将删除这些,但我宁愿不必让其他层担心 DAL。最佳做法是在 DAL 中的映射操作之前和之后放置 Mapper.Reset() 吗?或者有没有办法给这些 DAL 映射一个非默认键,让它们持久存在但不干扰 AutoMapper 在其他层的使用?

注意:在 DAL 中使用 AutoMapper 有一些特定的选项,例如我的其他层不应该使用的一些 .ForMember(...) 调用(如果没有Mapper.Reset(),它们会重用这些选项)。

【问题讨论】:

    标签: data-access-layer automapper reset separation-of-concerns


    【解决方案1】:

    AutoMapper 作为单例/单个实例工作。不过这真的很重要吗?

    编辑:这可能会帮助你Using Profiles in Automapper to map the same types with different logic

    如果您的其他层不太担心 DAL 类,那么他们可能不会在 DAL 类的实例上调用 Map。

    如果您调用 Reset(),那么您的 DAL 类将需要在下次需要执行一些映射时重新声明它们,这将增加额外的非常不必要的开销。

    编辑:如果您在每次 DAL 调用开始时调用 Reset,那么您只能使用单线程数据访问策略。如果您在另一个 DAL 项目的映射中间调用 Reset,那么您显然会破坏这一点 - 因此您必须锁定每个 DAL 方法。

    这不是使用 Automapper 的方式,所以我倾向于查看这些配置文件,或者不一起使用它们。

    ALSO:您能否发布一个示例代码,说明在进行大量多个映射时有什么问题?两种类型之间是否存在不同的映射策略,具体取决于它们在 DAL 中的调用位置?

    【讨论】:

    • 不幸的是,DAL 生成的代码是很多特定项目中的全部。所以看起来我在 DAL 中的每次 Map 调用之前和之后都被 Reset() 困住了。
    • 实际上,这是在打开一整罐这样做的蠕虫。重置是使用 Automapper 的错误方法。在这种情况下,我要么不使用 Automapper,要么尝试使用配置文件。
    • 如果 Automapper 的使用总是在相同类型之间(至少在 DAL 中),那么 是否还有另一种选择?我会调查个人资料。我也确实将其视为一罐蠕虫。我也无法真正改变 DAL 的使用方式。这一切都在 ASP.NET MVC 中,因此线程应该不是问题。我意识到 DAL 都是生成的代码,所以最好生成与 Automapper 调用等效的代码并在 DAL 层中取消它。
    • 我已经从 DAL 中删除了 AutoMapper 的使用,因为很明显它使用了 AutoMapper 功能的一小部分,但由于使用方式(使用 Mapper. Reset() 被如此频繁地调用)。相反,我进行了反思。谢谢!
    • 别担心!即使使用 MVC,您仍然会遇到线程问题,因为 AutoMapper 只有一次实例。很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2018-10-23
    • 2010-12-15
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多