1

任何想法如何告诉AutoMapper使用StructureMap来解析TypeConverter构造函数参数?通过AutoMapper使用存储库(w/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)); 
     } 
    } 

而在自动映射登记:

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

不过,我不喜欢在我构造的转换器硬连线的ObjectFactory.GetInstance的想法。任何想法如何告诉AutoMapper如何解决我的IContentProviderRepository?

或者其他方法使用Automapper从视图模型ID中使用存储库来提供域对象的想法?

+0

不应该自动映射器只是映射? – Paco 2010-03-29 19:00:01

+0

你如何将你的视图中的Guid映射到完整的域对象? – mwjackson 2010-03-30 09:46:15

+0

这不是映射,即数据访问。 – Paco 2010-03-30 10:00:46

回答

4

我们使用这个(在我们的引导程序的任务之一).. 。

 private IContainer _container; //Structuremap container 

     Mapper.Initialize(map => 
     { 
      map.ConstructServicesUsing(_container.GetInstance); 
      map.AddProfile<MyMapperProfile>(); 
     } 
+0

干杯,完美 – mwjackson 2010-03-29 11:41:18

+0

它需要空的构造函数。不是吗? – 2010-10-05 12:17:19

+0

嗨阿尔尼斯,不确定你的意思? 'MyMapperProfile'只是扩展了AutoMapper提供的Profile类。我们告诉AutoMapper我们正在使用的IoC容器。 – ozczecho 2010-10-05 22:41:10

1

ConstructUsing方法似乎有一个超载,接受Func<T1,T2>。在那里你可以访问你的容器。

编辑: 转换也知道这样,这样你可以做一个过载:

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

其中C是容器

+0

对不起,ContructUsing应转换使用 – mwjackson 2010-03-29 11:28:04

+0

谢谢,这也适用,但我认为接受的解决方案更清洁 – mwjackson 2010-03-29 11:45:56