2016-09-13 1 views
0

AutoMapperで遊んでいるとき、以下のような実装が可能かどうか(正しく設定できていないのか)を知りたいと思っていました。C#Automapper Generic Mapping

基本サービス:

public class BaseService<T, IEntityDTO> : IService<T, IEntityDTO> where T : class, IEntity 
{ 
    private IUnitOfWork _unitOfWork; 
    private IRepository<IEntity> _repository; 
    private IMapper _mapper; 

    public BaseService(IUnitOfWork unitOfWork, IMapper mapper) 
    { 
     _unitOfWork = unitOfWork; 
     _repository = unitOfWork.Repository<IEntity>(); 
     _mapper = mapper; 
    } 

    public IList<IEntityDTO> GetAll() 
    { 
     return _mapper.Map<IList<IEntityDTO>>(_repository.GetAll().ToList()); 
    } 
} 

コンクリートのサービス:

public class HotelService : BaseService<Hotels, HotelsDTO>, IHotelService 
{ 

    private IUnitOfWork _unitOfWork; 
    private IRepository<Hotels> _hotelsRepository; 
    private IMapper _mapper; 

    public HotelService(IUnitOfWork unitOfWork, IMapper mapper) : base(unitOfWork, mapper) 
    { 
     _unitOfWork = unitOfWork; 
     _hotelsRepository = unitOfWork.Repository<Hotels>(); 
     _mapper = mapper; 
    } 
} 

現在のマッピング:

public class AutoMapperProfileConfiguration : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Hotels, HotelsDTO>().ReverseMap(); 
    } 
} 

私はマッピングが行われるべきかについて親切に無知です。誰かアドバイスをしていますか、これはちょうど行く方法ではありませんか?

+0

あなたが尋ねていることは不明です。あなたは何に問題がありますか? –

+0

コードを更新して明確にしました。私は、基本サービスに渡されるものに基づいて、具体的な型のマッピングを行うことができるジェネリックマッピングを実装しようとしています。 – user2963570

+0

マッピングが自動的に行われるように、すべての具体的なサービスに汎用のものを書きたいと思います。それ以外の場合、私は具体的なサービスにgetallメソッドをドロップする必要があります。だから私は具体的な方法でマッピングを処理する必要があります。次に例を示します。_mapper.Map >(_ repository.GetAll()。ToList()); – user2963570

答えて

0

はbasecontrollerに渡されたエンティティのマッピングを調べ、次のコード行と私の問題を解決するために管理。

public List<TDTO> GetAll() 
{ 
    var list = _repository.GetAll().ToList(); 
    return (List<TDTO>)_mapper.Map(list, list.GetType(), typeof(IList<TDTO>)); 
} 
2

あなたは、一般的なパラメータとしてBaseServiceにDTOのタイプを指定することができます。

public class BaseService<T, TDTO> : IService<T, TDTO> 
    where T : class, IEntity 
    where TDTO : class, IEntityDTO 
{ 
    private IRepository<T> _repository; 
... 
... 
    public IList<TDTO> GetAll() 
    { 
     return _mapper.Map<IList<TDTO>>(_repository.GetAll().ToList()); 
    } 
} 
+0

返信いただきありがとうございますが、これは大文字と小文字を変更しません。問題はAutomapperが私が避けようとしているIEntityをマップしようとしていることです。 IEntityからIEntityDTOへのマッピングではなく、ホテルからHotelDTOへのマッピングが必要です。私は具体的な型のプレースホルダとしてIEntityとIEntityDTOを使いたいので、マッピングはジェネリックベースサービスで行うことができます。 – user2963570

+0

インタフェース(IRepository 'と' Map > ')の代わりに具体的な型だけを使用してください –

+0

これは私の指摘を超えています.. – user2963570