1

次のように、自動マッパーを使用してタスクを変換しています

Mapper.CreateMap<Task, GanttTask>().ForMember(dst => dst.parentIdRaw, opt => opt.ResolveUsing<TaskParentIdResolver>())

そのため、TaskParentIdResolver では、

public class TaskParentIdResolver : ValueResolver<Task, int?>
{
   protected IUow Uow { get; set; }
   public TaskParentIdResolver()
    {
        RepositoryFactories factory = new RepositoryFactories();
        IRepositoryProvider provider = new RepositoryProvider(factory);
        this.Uow = new Uow(provider);
    }
   protected override int? ResolveCore(Task source)
    {
        if (source.ParentId != null && source.ParentId != Guid.Empty)
        {
            var task = Uow.Tasks.GetById(source.ParentId.Value);
            return task.Id;
        }
        else return null;
    }
}

私が直面した問題は、

var tasksList = Mapper.Map<IEnumerable<Task>, IEnumerable<GanttTask>>(Uow.Tasks.GetAll().Where(con => con.IsProjectSummary == true)).ToList();

200 のタスクがある場合、リゾルバは 200 回呼び出され、毎回 Uow が親 ID を解決するために戻るのに時間がかかります。このタスク リストをリゾルバーにキャッシュして、最初の UOw のみがタスクを呼び出し、それ以外の場合はすべてタスクのキャッシュ リストを返すようにする方法はありますか。

4

1 に答える 1

2

AutoMapper にキャッシングを入れないでください。AutoMapper が使用するサービスにキャッシングを入れてください。ORM を使用している場合は、ORM で利用可能なキャッシュを使用します。

于 2015-07-31T16:18:14.700 に答える