【发布时间】: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 => pr.StoreId == storeId)。我希望把它交给 AutoMapper,这样每次都会自动完成。 -
我认为这样做的方法是在查询中进行过滤。但你可以试试after action。
-
我认为在自动映射器映射中进行过滤不是最好的解决方案,如果您想使用尝试使用自定义转换器或 After Action。
-
您使用的是 AutoMapper 还是 Mapper.Map 的 LINQ 投影?
标签: entity-framework asp.net-web-api automapper repository-pattern dto