2011-03-03 23 views
3

使用AutoMapper後,我在本網站上發現了ValueInjecter。我正在嘗試它,但我堅持什麼可能是一個非常簡單的情況。ValueInjecter問題

但在我深入代碼示例之前,有沒有人知道ValueInjecter是否可以在中等信任的Web環境中工作? (像Godaddy?)

好吧,到代碼!我有以下型號:

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

,我想要映射到以下DTO:

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,因爲這些單詞也會顛倒自己,即:名字< - > Name.First。所以First和Last的名字可以使用相同的規則,但MiddleInitial呢? Model.Name.MiddleInitial - > DTO.MiddleInitial。

我看到有一些插件,但他們似乎沒有做我想做的。有沒有其他人遇到這種情況?

回答

1

基本思想是,我將NameFirstName相匹配,我將此作爲支點,並且在通常將該值設置爲一個(FirstName)屬性的方法中,我將其設置爲3個屬性 - 這是爲在ToNameCompFromNameComp

我匹配相同的特性,但我取的值從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; } 
     } 
} 

但在此之前我挖入代碼示例, 沒有任何人ķ現在如果ValueInjecter 在中等信任網絡 環境中工作? (例如GoDaddy?)

它不使用Reflection.Emit的所以它應該工作

+0

我迫不及待地想嘗試了這一點!感謝您的答覆。看着解決方案給我帶來了另一個問題。我發現爲了映射Person - > PersonDTO需要這樣的東西。 var pp = new Person(); pp.InjectFrom(dto); pp.InjectFrom (dto); 是否有任何形式的設施可以讓我設置地圖在啓動時註冊這種東西? – NYCChris 2011-03-03 13:59:18

+0

類似於 'var injecter = new ValueInjecter(); injecter.Define <人,PersonDTO>((人,DTO,噴油器)=> \t { \t \t injecter.Inject(DTO,人); \t \t injecter.Inject(進樣(DTO,人); \t}); ' 然後後來在使用它只是這個... pp.InjectFrom(dto); – NYCChris 2011-03-03 13:59:50

+0

@NYCChris :)不,這是automapper,但你可以創建自己的映射類,並把有什麼你需要注射 – Omu 2011-03-03 14:45:41