3

次の 2 つの基本ビュー モデル クラスがあり、すべてのビュー モデルが (これまで) 派生しています。

public class MappedViewModel<TEntity>: ViewModel
{
    public virtual void MapFromEntity(TEntity entity)
    {
        Mapper.Map(entity, this, typeof (TEntity), GetType());
    }
}

public class IndexModel<TIndexItem, TEntity> : ViewModel
    where TIndexItem : MappedViewModel<TEntity>, new()
    where TEntity : new()
{
    public List<TIndexItem> Items { get; set; }
    public virtual void MapFromEntityList(IEnumerable<TEntity> entityList)
    {
        Items = Mapper.Map<IEnumerable<TEntity>, List<TIndexItem>>(entityList);
    }
}

上記の のように、AutoMapper がリストをすべて単独で実行できることを知る前は、ループを実行して、すべてのリスト アイテムの新しいインスタンスをMapFromEntityList呼び出していました。MapFromEntityMappedViewModel

MapFromEntityAutoMapper で使用されていないという理由だけでオーバーライドする機会を失いましたMapFromEntityList。これを実現するには、明示的なループにオーバーライドする必要もあります。

アプリの起動時に、次のようなマッピング構成を使用します。

Mapper.CreateMap<ClientCourse, ClientCourseIndexItem>();

AutoMapper にMapFromEntity、たとえば everyを常に呼び出すように指示するにはどうすればよいClientCourseIndexIteですか? または、これをすべて行うためのより良い方法はありますか?

ところで、MapFromEntityインデックス モデルではなく、編集モデルで明示的な呼び出しを使用することがよくあります。

4

1 に答える 1

2

MapFromEntity メソッドを呼び出すコンバーターを実装できます。次に例を示します。

public class ClientCourseConverter<TSource, TDestination>: ITypeConverter<TSource, TDestination>
       where TSource :  new()
       where TDestination : MappedViewModel<TEntity>, new()
{
    public TDestination Convert(ResolutionContext context)
    {
        var destination = (TDestination)context.DestinationValue;
        if(destination == null)
            destination = new TDestination();
        destination.MapFromEntity((TSource)context.SourceValue);
    }
}

// Mapping configuration
Mapper.CreateMap<ClientCourse, ClientCourseIndexItem>().ConvertUsing(
 new ClientCourseConverter<ClientCourse, ClientCourseIndexItem>());
于 2012-07-10T18:56:09.233 に答える