Подходы к использованию репозиториев (с / StructureMap) с AutoMapper? - PullRequest
1 голос
/ 29 марта 2010

Любая идея, как я могу сказать AutoMapper для разрешения аргумента конструктора TypeConverter с помощью StructureMap?

т. У нас есть это:

    private class StringIdToContentProviderConverter : TypeConverter<string, ContentProvider> {
        private readonly IContentProviderRepository _repository;

        public StringIdToContentProviderConverter(IContentProviderRepository repository) {
            _repository = repository;
        }

        public StringIdToContentProviderConverter() {
            _repository = ObjectFactory.GetInstance<IContentProviderRepository>();
        }

        protected override ContentProvider ConvertCore(string contentProviderId) {
            return _repository.Get(new Guid(contentProviderId));
        }
    }

А при регистрации в AutoMap:

        Mapper.CreateMap<Guid, ContentProvider>().ConvertUsing<GuidToContentProviderConverter>();

Тем не менее, мне не нравится идея жесткого соединения ObjectFactory.GetInstance в моем конструкторе для конвертера. Любые идеи, как я могу сказать AutoMapper, как решить мой IContentProviderRepository?

Или идеи других подходов к использованию Automapper для гидратации объектов домена из идентификаторов viewmodel с использованием репозитория?

Ответы [ 2 ]

4 голосов
/ 29 марта 2010

Мы используем это (в одной из наших задач Bootstrapper) ...

        private IContainer _container; //Structuremap container

        Mapper.Initialize(map =>
        {
            map.ConstructServicesUsing(_container.GetInstance);
            map.AddProfile<MyMapperProfile>();
        }
1 голос
/ 29 марта 2010

Кажется, что метод ConstructUsing имеет перегрузку, которая принимает Func<T1,T2>. Там вы можете получить доступ к вашему контейнеру.

EDIT: Convert также знает такую ​​перегрузку, которую вы могли бы сделать:

Mapper.CreateMap<A, B>().ConvertUsing(i=> c.With(i).GetInstance<B>());

Где c ваш контейнер

...