【问题标题】:AutoMapper - Trying to pass variables from WEB API Controller to Automapper configuration at runtimeAutoMapper - 尝试在运行时将变量从 WEB API 控制器传递到 Automapper 配置
【发布时间】:2015-07-30 00:46:20
【问题描述】:

我正在处理一个使用 AutoMapper 将实体映射到 DTO 的大型项目 - 这对于简单的映射非常有效,但我目前在尝试让一些自定义映射正常工作时遇到了困难。

这是我正在尝试做的一个简化示例。我有一个产品、价格和商店类:

public class Product
{
    public Guid Id { get; set; }
    public ICollection<Price> Prices { get; set; }
}

public class Price
{
    public Guid Id { get; set; }
    public Guid ProductId { get; set; }
    public Guid StoreId { get; set; }
    public decimal Value { get; set; }

    public virtual Product Product { get; set; }
    public virtual Store Store { get; set; }
}

每个类也有一个 DTO。默认情况下,当我访问 ProductDTO 类时,我将获得所有商店的所有价格。但是,当特定商店登录到应用程序时,我想将他们看到的价格限制在他们的商店中。

我希望 AutoMapper 能够处理此问题,以便当我的 WEB API 控制器调用存储库以获取 ProductDTO 时,价格列表会自动过滤为仅包含当前登录的商店价格。

我已经在我的 WEB API 项目的 Startup 类中设置了我的 AutoMapper 配置。我知道我可以像这样设置自定义映射:

Mapper.Configuration.CreateMap<Product, ProductDto>()
    .ForMember(pd => pd.Prices,
        opt => opt.MapFrom(p => p.Prices.Where(pp => pp.StoreId == storeId));

但我只知道请求进入 WEB API 控制器后当前登录的商店 (storeId) 是什么。那么,是否有可能以我可以在运行时更新配置的方式设置我的配置,或者是否有更好的方法来完全解决这个问题?这是一个非常简单的例子——我正在处理的这个项目中有数百个类似的场景(不限于按商店 ID 过滤),所以我想实现一些尽可能通用的东西。

【问题讨论】:

  • 为什么不只提取登录用户的价格,而只有这些价格会被映射?为什么要在 automapper 中过滤数据。
  • 这是我目前正在做的,但每次我想获得一个带有价格的 ProductDto 时,我都必须在 LINQ 语句中包含Prices.Where(pr =&gt; pr.StoreId == storeId)。我希望把它交给 AutoMapper,这样每次都会自动完成。
  • 我认为这样做的方法是在查询中进行过滤。但你可以试试after action
  • 我认为在自动映射器映射中进行过滤不是最好的解决方案,如果您想使用尝试使用自定义转换器或 After Action。
  • 您使用的是 AutoMapper 还是 Mapper.Map 的 LINQ 投影?

标签: entity-framework asp.net-web-api automapper repository-pattern dto


【解决方案1】:

您需要在 AutoMapper 中使用parameterized LINQ query support

int storeId = 0;
Mapper.Configuration.CreateMap<Product, ProductDto>()
    .ForMember(pd => pd.Prices,
        opt => opt.MapFrom(p => p.Prices.Where(pp => pp.StoreId == storeId));

然后在你的控制器中:

dbContext.Products.ProjectTo<ProductDto>(new { storeId = currentLoggedInStoreId });

AutoMapper 会在运行时根据匹配“storeId”的参数将该参数传递给“Where”表达式的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多