如何在类型转换器中获取对映射器的引用?

How to get reference to mapper in type converter?

有没有办法在类型转换器中访问映射器。现在,这很糟糕,我必须执行 ObjectFactory.GetInstance 才能从 StructureMap 获取会话实例。如果我能够获得对映射器的引用,我可以使用它来获取实体的实例,例如 mapper.Map 并避免在类型转换器中调用静态方法。

所以这段代码

 public class AddBaseProductCommandConverter : TypeConverter<AddBaseProductService.AddBaseProduct, AddBaseProductCommand>
    {
        protected override AddBaseProductCommand ConvertCore(AddBaseProductService.AddBaseProduct source)
        {
            var session = ObjectFactory.GetNamedInstance<ISession>("PRDProd");
            var marketingPlan = session.Get<MarketingPlan>(source.BaseProductInfo.MarketingPlanId);
            var baseProductTemplate = session.Get<BaseProductTemplate>(source.BaseProductInfo.Code);
            var benefitPeriod = session.Get<BenefitPeriod>(source.BaseProductInfo.BenefitPeriodCode);
            var insuranceServiceType = session.Get<InsuranceServiceType>(source.BaseProductInfo.ServiceTypeCode);

            var command = new AddBaseProductCommand
            {
                MarketingPlan = marketingPlan,
                BaseProductTemplate = baseProductTemplate,
                BenefitPeriod = benefitPeriod,
                InsuranceServiceType = insuranceServiceType
            };

            return command;
        }
    }

可以这样重写(我在配置阶段为 NHIbernate 识别的每个持久类型构建了一个映射)

 public class AddBaseProductCommandConverter : TypeConverter<AddBaseProductService.AddBaseProduct, AddBaseProductCommand>
    {
        protected override AddBaseProductCommand ConvertCore(AddBaseProductService.AddBaseProduct source)
        {
            var mapper = ????

var  marketingPlan = mapper.Map<int,MarketingPlan(source.BaseProductInfo.MarketingPlanId);
            var baseProductTemplate = mapper.Map<string,BaseProductTemplate>(source.BaseProductInfo.Code);
... and so on ...
           return command;
        }
    }

您可以实现 ITypeConverter 而不是 TypeConverter,然后使用参数 context 来使用 context.Engine.Mapper 获取映射器,如下所示:

public class AddBaseProductCommandConverter : ITypeConverter<AddBaseProductService.AddBaseProduct, AddBaseProductCommand>
{
    public AddBaseProductCommand Convert(ResolutionContext context)
    {
        if (context.SourceValue == null || !(context.SourceValue is AddBaseProductService.AddBaseProduct))
            throw new AutoMapperMappingException();

        var mapper = context.Engine.Mapper;

        ...
    }
}

对于使用较新版本的 Automapper(例如 8)遇到此问题的任何人,ITypeConverterResolutionContext 定义与之前的答案有所不同。您可以通过上下文中的 Mapper 成员访问映射器。例如

public class AddBaseProductCommandConverter : ITypeConverter<AddBaseProductService.AddBaseProduct, AddBaseProductCommand>
{
    public AddBaseProductCommand Convert(AddBaseProductService.AddBaseProduct source, AddBaseProductCommand destination, ResolutionContext context)
    {
        var mapper = context.Mapper;

        ...
    }
}