2011-03-03 2 views
3

AutoMapper로 작업 한 후에이 사이트에서 ValueInjecter을 발견했습니다. 나는 그것을 시도하고 있지만 아마도 나는 아주 단순한 시나리오에 머물러있다.ValueInjecter 질문

하지만 코드 샘플을 조사하기 전에 중간 신뢰 웹 환경에서 ValueInjecter가 작동하는지 누구든지 알고 있습니까? (Godaddy처럼?)

코드에! 나는 다음과 같은 DTO에 매핑 할

public class NameComponent 
{ 
    public string First { get; set; } 
    public string Last { get; set; } 
    public string MiddleInitial { get; set; } 
} 
public class Person 
{ 
    public NameComponent Name { get; set; } 
} 

: 나는 다음과 같은 모델이 그래서

public class PersonDTO : BaseDTO 
{ 
    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set { NotifyPropertyChanged(() => FirstName, ref _firstName, value); } 
    } 

    private string _middleInitial; 
    public string MiddleInitial 
    { 
     get { return _middleInitial; } 
     set { NotifyPropertyChanged(() => MiddleInitial, ref _middleInitial, value); } 
    } 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set { NotifyPropertyChanged(() => LastName, ref _lastName, value); } 
    } 
} 

을 내가 DTO에 모델로 매핑 할 때이 Model.Name.First 필요를 -> DTO.FirstName DTO에서 모델로 이동하려면 FirstName -> Name.First가 필요합니다. 내 이해에서 이것은 단순한 Flatten/UnFlatten이 아니기 때문에 단어 자체도 바꿔 쓰기 때문입니다. FirstName < -> Name.First. 따라서 성과 이름은 같은 종류의 규칙을 사용할 수 있지만 MiddleInitial은 어떻습니까? Model.Name.MiddleInitial -> DTO.MiddleInitial.

일부 플러그인이 있지만 그 중 누구도 내가 원하는 것을 수행하지 않는 것으로 보입니다. 다른 사람이이 시나리오를 보았습니까?

답변

1

기본 아이디어는 FirstName으로 Name과 일치하며, 이것을 피벗 포인트로 사용하고 일반적으로 하나의 (성) 속성에 값을 설정하는 방법에서는 3 가지 속성으로 설정합니다. ToNameComp에서 FromNameComp

나는 동일한 속성과 일치하지만 3에서 값을 가지고 하나를 만들고

public class SimpleTest 
    { 
     [Test] 
     public void Testit() 
     { 
      var p = new Person { Name = new NameComponent { First = "first", Last = "last", MiddleInitial = "midd" } }; 
      var dto = new PersonDTO(); 
      dto.InjectFrom<FromNameComp>(p); 

      Assert.AreEqual(p.Name.First, dto.FirstName); 
      Assert.AreEqual(p.Name.Last, dto.LastName); 
      Assert.AreEqual(p.Name.MiddleInitial, dto.MiddleInitial); 

      var pp = new Person(); 
      pp.InjectFrom<ToNameComponent>(dto); 

      Assert.AreEqual(dto.LastName, pp.Name.Last); 
      Assert.AreEqual(dto.FirstName, pp.Name.First); 
      Assert.AreEqual(dto.MiddleInitial, pp.Name.MiddleInitial); 

     } 

     public class FromNameComp : ConventionInjection 
     { 
      protected override bool Match(ConventionInfo c) 
      { 
       return c.SourceProp.Name == "Name" && c.SourceProp.Type == typeof(NameComponent) 
        && c.TargetProp.Name == "FirstName" 
         && c.SourceProp.Value != null; 
      } 

      protected override object SetValue(ConventionInfo c) 
      { 
       dynamic d = c.Target.Value; 
       var nc = (NameComponent)c.SourceProp.Value; 
       //d.FirstName = nc.First; return nc.First does this 
       d.LastName = nc.Last; 
       d.MiddleInitial = nc.MiddleInitial; 
       return nc.First; 
      } 
     } 

     public class ToNameComponent : ConventionInjection 
     { 
      protected override bool Match(ConventionInfo c) 
      { 
       return c.TargetProp.Name == "Name" && c.TargetProp.Type == typeof(NameComponent) 
         && c.SourceProp.Name == "FirstName"; 
      } 

      protected override object SetValue(ConventionInfo c) 
      { 
       dynamic d = c.Source.Value; 
       var nc = new NameComponent { First = d.FirstName, Last = d.LastName, MiddleInitial = d.MiddleInitial }; 
       return nc; 
      } 
     } 

     public class NameComponent 
     { 
      public string First { get; set; } 
      public string Last { get; set; } 
      public string MiddleInitial { get; set; } 
     } 

     public class Person 
     { 
      public NameComponent Name { get; set; } 
     } 

     public class PersonDTO 
     { 
      public string FirstName { get; set; } 
      public string MiddleInitial { get; set; } 
      public string LastName { get; set; } 
     } 
} 

을 설정할하지만 코드 샘플 파고 전에, 누구의 K를 않습니다 이제 ValueInjecter 이 Medium-Trust 웹 환경에서 작동합니까? (GoDaddy이처럼?)

+0

작동합니다 그래서 나는이 밖으로 시도하는 것을 기다릴 수 없어 Reflection.Emit를 사용하지 않습니다! 답장을 보내 주셔서 감사합니다. 해결책을 보면서 나를 또 다른 질문으로 안내하십시오. 필자는 Person -> PersonDTO에서 매핑하기 위해서는 이와 비슷한 것을 필요로한다는 것을 알았다. var pp = 새 Person(); pp.InjectFrom (dto); pp.InjectFrom (dto); 시작할 때 이런 종류의 물건을 등록하도록지도를 설정할 수있는 시설이 있습니까? – NYCChris

+0

같은 문자 'var injecter = 새로운 ValueInjecter(); injecter.Define <이용시, PersonDTO> ((사람, DTO, injecter) => { \t \t \t injecter.Inject (DTO, 사람) \t \t injecter.Inject (주입한다 (DTO, 사람); \t}); ' 나중에 사용 중입니다 ... pp.InjectFrom (dto); – NYCChris

+0

@NYCChris :) 아니요, automapper입니다.하지만 자신의 매퍼 클래스를 만들고 거기에 당신이 필요로하는 모든 주사 – Omu