gpt4 book ai didi

c# - Automapper 为 T 类型初始化

转载 作者:行者123 更新时间:2023-11-30 12:55:12 25 4
gpt4 key购买 nike

我想使用通用方法从数据库中获取数据并传递输出数据的外观模型。

我写了简单的方法:

public IEnumerable<T> GetUsers<T>()
{
Mapper.Initialize(cfg =>
cfg.CreateMap<IQueryable<User>, IQueryable<T>>());

return OnConnect<IEnumerable<T>>(db =>
{
return db.Users.ProjectTo<T>().ToList();
});
}

现在我希望我能做到这一点:

var users = repo.GetUsers<UserViewModel>(); // it should be IEnumerable<UserViewModel>
var anotherUsers = repo.GetUsers<AnotherUserViewModel>(); // it should be IEnumerable<AnotherUserViewModel>

但我无法再次重新初始化 automapper。我应该怎么做才能让它发挥作用?

最佳答案

  1. 在每次应用程序启动时只初始化自动映射器一次
  2. 在设计代码时,您应该知道可以从 User 映射哪些类型,在这种情况下,您可以像这样在启动时注册所有类型:

        Mapper.Initialize(cfg => {
    cfg.CreateMap<User, UserDto1>();
    cfg.CreateMap<User, UserDto2>();
    ...
    cfg.CreateMap<User, UserDtoN>();
    });
  3. 即使您将实现它 - 尝试将 User 映射到 Order 也没有任何意义,但您的架构设计将提供这种可能性

  4. 如果您仍然想这样做(就像我在评论中写的那样)- 您可以为实例添加某种标记属性 - MappableFrom(Type from),标记所有可以在自动映射器范围内使用的 DTO 对象。然后在您的应用程序初始化时 - 扫描包含该属性的所有类型的程序集并在 Automapper 中注册。

关于c# - Automapper 为 T 类型初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51060546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com