Automapper инициализировать для типа T - PullRequest
0 голосов
/ 27 июня 2018

Я хочу использовать универсальный метод для получения данных из базы данных и передачи модели того, как должны выглядеть выходные данные.

Я написал простой метод:

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. Что я должен сделать, чтобы это работало?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете использовать профиль для создания всех картографов, перейдя по этой ссылке http://docs.automapper.org/en/stable/Configuration.html

Другой подход, который вы можете инициализировать в статическом конструкторе - все отображения, которые вы хотите, используя некоторые соглашения об именах

В приведенном ниже коде я отображаю один и тот же тип объекта на тот же тип объекта

// Data or View Models

public class AddressViewModel : BaseViewModel
{
    public string Address {get;set;}
    public AddressViewModel()
    {
        this.Address ="Address";
    }

}

public class UserViewModel : BaseViewModel
{
    public string Name {get;set;}
    public UserViewModel()
    {
        this.Name ="Name";
    }
}
public class BaseViewModel
{

}

Репозиторий - здесь я использую ту же модель представления, вы должны создать здесь Модели

public class CrudRepo
{
     public IEnumerable<T> GetData<T>() where T : class, new ()
     {
        var data = new List<T> { new T() };
        return AutoMapper.Mapper.Map<IEnumerable<T>>(data);
     }
}

Затем в статическом конструкторе инициализировать преобразователи

    static HelperClass()
    {
        // In this case all classes are present in the current assembly
        var items = Assembly.GetExecutingAssembly()
                            .GetTypes().Where(x =>
                                              typeof(BaseViewModel)
                                              .IsAssignableFrom(x))
                            .ToList();
        AutoMapper.Mapper.Initialize(cfg =>
        {
            items.ForEach(x =>
            {
                // Here use some naming convention or attribute to find out the Source and Destination Type
                //Or use a dictionary which gives you source and destination type
                cfg.CreateMap(x, x);
            });
        });
    }

Теперь вы можете создать экземпляр репозитория crud и получить сопоставленные элементы

    var userRepo = new CrudRepo();

    var users = userRepo.GetData<UserViewModel>();
    var address = addressRepo.GetData<AddressViewModel>();

Note: Пока имена и типы свойств совпадают, данные будут отображаться, иначе вам придется создавать ForMember

0 голосов
/ 27 июня 2018
  1. Инициализировать только автомаппер один раз за запуск приложения .
  2. Вы должны знать, какие типы могут отображаться из User уже в тот момент, когда вы разрабатываете код, в этом случае вы можете зарегистрировать все из них при запуске, как это:

        Mapper.Initialize(cfg => {
                cfg.CreateMap<User, UserDto1>();
                cfg.CreateMap<User, UserDto2>();
                ...
                cfg.CreateMap<User, UserDtoN>();
            });
    
  3. Даже если вы достигнете этого - не имеет смысла пытаться сопоставить User с Order, но ваш архитектурный дизайн даст такую ​​возможность

  4. Если вы все еще хотите это сделать (как я написал в комментариях) - вы можете добавить некоторый атрибут маркера для Instance - MappableFrom (Type from), пометить все объекты DTO, которые можно использовать в области автоматического поиска. Затем при инициализации вашего приложения - отсканируйте сборку для всех типов, содержащих этот атрибут, и зарегистрируйтесь в Automapper.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...