首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Automapper与依赖注入一起使用

Automapper与依赖注入一起使用
EN

Stack Overflow用户
提问于 2010-11-17 21:11:03
回答 4查看 27.4K关注 0票数 24

我目前有以下映射:

代码语言:javascript
复制
Mapper.CreateMap<Journal, JournalDto>();

现在,Journal包含一个名为RefTypeID的成员,对应的值存在于数据库的另一个表中;为了查找这个值,我有一个服务来处理一个简单的int -> string请求。自动映射器配置当前发生在程序开始时的静态类中。是否可以将映射代码移动到注入到DI容器的类中,或者是否有更好的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-18 08:41:47

下面是我解决这个问题的方法:

我定义了一个IMappingCreator接口:

代码语言:javascript
复制
public interface IMappingCreator
{
  void CreateMappings();
}

接下来,我实现了一个带有该接口的类(我使用MEF作为DI容器,这就是属性的来源),它作为IMappingCreator放入DI容器中

代码语言:javascript
复制
[Export(typeof(IMappingCreator))]
    public class Mapping : IMappingCreator
    {
        private readonly IRefTypesLookup iRefTypesLookup;


        [ImportingConstructor]
        public Mapping(IRefTypesLookup rtl)
        {
            iRefTypesLookup = rtl;
        }

        public void CreateMappings()
        {
            Mapper.CreateMap<Journal, DisplayJournal>().AfterMap((j, dj) => dj.RefTypeName = iRefTypesLookup.Lookup(j.RefTypeID));
        }
    }

最后,在我的应用程序启动时,我获取容器中该接口的所有实例,并对它们调用CreateMappings方法:

代码语言:javascript
复制
    var mappings = container.GetExportedValues<IMappingCreator>();

    foreach (IMappingCreator mc in mappings)
    {
        mc.CreateMappings();
    }

这使得初始设置变得非常简单,因为所有的创建都发生在一个地方,并且您可以有尽可能多的映射创建器(但是,您应该保持最少的映射创建器,可能每个项目一次左右,获取映射该项目中特定类型所需的所有服务)。

票数 9
EN

Stack Overflow用户

发布于 2011-12-13 21:35:53

更好的方法是使用客户解析器。映射配置是静态的,因此自定义解析器旨在为单个成员提供映射:

代码语言:javascript
复制
Mapper.Initialize(cfg => {
    cfg.ConstructServicesUsing(type => WhateverMefUsesToGetInstances.GetInstance(type));

    cfg.CreateMap<Journal, DisplayJournal>()
        .ForMember(dest => dest.RefTypeName, 
            opt => opt.ResolveUsing<RefTypeNameResolver>());
});

那么你的解析器就变成了:

代码语言:javascript
复制
[Export(typeof(IRefTypeNameResolver))]
public class RefTypeNameResolver : ValueResolver<Journal, string>, IRefTypeNameResolver
{
    private readonly IRefTypesLookup iRefTypesLookup;

    [ImportingConstructor]
    public RefTypeNameResolver (IRefTypesLookup rtl)
    {
        iRefTypesLookup = rtl;
    }

    protected override string ResolveCore(Journal source)
    {
        return iRefTypesLookup.Lookup(source.RefTypeID);
    }
}

配置需要执行一次,这就是为什么配置API提供到执行API (类型转换器、值解析器等)的钩子。

票数 18
EN

Stack Overflow用户

发布于 2011-12-12 23:23:26

您可以依赖于IMappingEngine而不是使用静态类Mapper

这里有一篇很好的博客文章:Mocking out AutoMapper with Dependency Injection

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4204664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档