AutoMapper - 尝试在运行时将变量从 WEB API 控制器传递到 Automapper 配置

AutoMapper - Trying to pass variables from WEB API Controller to Automapper configuration at runtime

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

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

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; }
}

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

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

我已经在我的 WEB API 项目的 Startup class 中设置了我的 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 中使用 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 });

A​​utoMapper 将在运行时根据它匹配 "storeId" 将参数传递给您的 "Where" 表达式的变量。