c# – 自动映像为T类型初始化

我想要通用方法从数据库中获取数据并传递输出数据应该如何的模型.

我写了简单的方法:

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.我该怎么做才能让它发挥作用?

解决方法:

>每个应用程序启动时只初始化一次automapper.
>在设计代码时,您应该知道可以从用户映射的类型,在这种情况下,您可以在启动时注册所有类型,如下所示:

    Mapper.Initialize(cfg => {
            cfg.CreateMap<User, UserDto1>();
            cfg.CreateMap<User, UserDto2>();
            ...
            cfg.CreateMap<User, UserDtoN>();
        });

>即使您将实现它 – 尝试将用户映射到订单也没有意义,但您的架构设计将提供这种可能性
>如果您仍想这样做(就像我在评论中写的那样) – 您可以为Instance添加一些标记属性 – MappableFrom(Type from),标记可以在automapper范围内使用的所有DTO对象.然后在初始化应用程序时 – 扫描程序集以查找包含该属性的所有类型并在Automapper中注册.

上一篇:c# – 如何让Automapper通过Id字段上的内连接获取相关记录,而不是外键?


下一篇:c# – 如何使用AutoMapper将MySQL时间戳保存为String而不是DateTime?