8

オブジェクトからプロパティを別のプロパティ名で別のオブジェクトにマップするにはどうすればよいですか?ValueInjecterを使用して異なるプロパティ名を持つオブジェクト間をマッピングする

私はこのようになりますProductクラスがあります。

public class Product : IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

を、ビューモデルは次のようになります。私は次のようなマッピングを行う必要があり

public class ProductSpecificationAddViewModel 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
} 

Product.Id => ProductSpecificationAddViewModel.ProductId 
Product.Name =>ProductSpecificationAddViewModel.ProductName 

ここに私の行動方法があります:

public ActionResult Add(int id) 
{ 
    Product product = productService.GetById(id); 

    // Mapping 
    //ProductSpecificationAddViewModel viewModel = new ProductSpecificationAddViewModel(); 
    //viewModel.InjectFrom(product); 

    return View(viewModel); 
} 

どうすればよいですか?

答えて

8

あなたがValueInjecterを使用している場合、あなたはConventionInjectionを書くでしょう。 。* * + TTarget.TSourceに、この注射はTSOURCEのすべてのプロパティから行いますhere

public class PropToTypeProp : ConventionInjection 
    { 
     protected override bool Match(ConventionInfo c) 
     { 
      return c.TargetProp.Name == c.Source.Type.Name + c.TargetProp.Name; 
     } 
    } 

第二のサンプルを参照してください、あなたが実行します。

vm.InjectFrom<PropToTypeProp>(product); 
+0

ConventionInjectionは現在世界のどこにも見つかりません。 –

3

AutoMapperで簡単にこれを行うことができます。デフォルトでは規約が使用されています(IdはIdとName to Nameにマップされます)。カスタムマッピングも定義できます。

Mapper.CreateMap<Product, ProductSpecificationAddViewModel>() 
    .ForMember(destination => destination.ProductName, 
       options => options.MapFrom(
        source => source.Name)); 

あなたcontollerマッピングコードは、この単純なことになります。

Mapper.Map(product, viewModel); 
+0

私はそれがAutoMapperと簡単です知っているが、私はできません信頼レベルのためにWebホスティングサーバーで使用するので、ValueInjecterを解決する必要があります。 –

+0

ここにちょっと興味があります。サーバー上のAutomapperにはどのような信頼レベルが必要ですか。どちらもdllですよね? – user20358

+1

Medium Trustホスティングサービスは、Refaption.Emitが中程度の信頼性で動作しないため、オートマトンに問題があります –

関連する問題