2016-06-07 1 views
1

Есть ли способ получить доступ к конвертеру в конвертере типов. Прямо сейчас, что плохо, я должен сделать ObjectFactory.GetInstance, чтобы получить экземпляр сеанса из StructureMap. Если бы мне удалось получить ссылку на mapper, я мог бы использовать это, чтобы получить экземпляр объекта, например mapper.Map, и избежать статического вызова метода в конвертере типов.Как получить ссылку на mapper в конвертере типов?

Так что этот код

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; 
     } 
    } 

ответ

0

Вы можете реализовать 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; 

     ... 
    } 
} 
Смежные вопросы