如何在类型转换器中获取对映射器的引用?
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)遇到此问题的任何人,ITypeConverter
和 ResolutionContext
定义与之前的答案有所不同。您可以通过上下文中的 Mapper
成员访问映射器。例如
public class AddBaseProductCommandConverter : ITypeConverter<AddBaseProductService.AddBaseProduct, AddBaseProductCommand>
{
public AddBaseProductCommand Convert(AddBaseProductService.AddBaseProduct source, AddBaseProductCommand destination, ResolutionContext context)
{
var mapper = context.Mapper;
...
}
}
有没有办法在类型转换器中访问映射器。现在,这很糟糕,我必须执行 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)遇到此问题的任何人,ITypeConverter
和 ResolutionContext
定义与之前的答案有所不同。您可以通过上下文中的 Mapper
成员访问映射器。例如
public class AddBaseProductCommandConverter : ITypeConverter<AddBaseProductService.AddBaseProduct, AddBaseProductCommand>
{
public AddBaseProductCommand Convert(AddBaseProductService.AddBaseProduct source, AddBaseProductCommand destination, ResolutionContext context)
{
var mapper = context.Mapper;
...
}
}