【问题标题】:Automapper global destination instantiatorAutomapper 全局目标实例化器
【发布时间】:2017-10-20 16:28:25
【问题描述】:

我正在使用 automapper 将我的 DTO 映射到 Viewmodel,我的一些 ViewModel 依赖于服务。

我找到了几种使用这些依赖项构造目标对象的方法,但我想知道是否可以只使用全局对象解析器(在我的例子中是 UnityContainer)?

我目前的解决方案是这样的:

config.CreateMap<SurveyDTO, SurveyViewModel>()
                .ConstructUsing(x => _ObjectResovler.Resolve<SurveyViewModel>())

或者

config.CreateMap<SurveyDTO, SurveyViewModel>()
                .ConstructUsingServiceLocator()

但这意味着我必须在每个映射中包含这样的一行。 有没有办法只对所有映射使用解析器而不在配置中指定它?

【问题讨论】:

  • 危险将罗宾逊检测到 IOC 使用不当,危险危险。所有在开玩笑,您的视图模型都不应该有服务依赖,如果他们确实使用了服务定位器,那将是对 IOC 的错误使用。花点时间阅读更多关于如何设置 MVC 应用程序以及如何使用 IOC 来管理它们的信息。
  • @P.Roe 谢谢你的快速回答:),你有一个小例子或类似的东西吗?我不明白如何在不注入服务的情况下将视图模型的“保存”请求中继到服务。目前我将 SaveCommand 绑定到保存按钮。然后我被困在视图模型中。我在 xamarin CRM 示例 (github.com/xamarin/app-crm/blob/master/src/MobileApp/XamarinCRM/…) 中找到了这种结构。我发现了一些其他关于此的 SO 问题,但其中大多数最终都是使用服务层的视图模型。
  • 啊,我看到您使用的是 MVVM 而不是我假设的 MVC。这极大地改变了事情。 msdn.microsoft.com/en-us/magazine/jj991965.aspx
  • 很棒的文章,根据图 3 和图 10,我会说我的做法是正确的。但这让我回到了最初的问题,我真的需要告诉 automapper 允许对每个映射使用服务定位器(/手动创建目标对象)。这不是很多工作,但它是另一行可能会被遗忘:)

标签: c# automapper


【解决方案1】:

我通过使用解决了它

config.ForAllMaps((map, opts) => opts
          .ConstructUsing(x => _ObjectResovler.Resolve(map.DestinationType)));

对于您可以使用的服务定位器替代方案:

config.ForAllMaps((map, opts) => opts.ConstructUsingServiceLocator());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多