2017-12-21 10 views
0

Ich habe ein Problem mit einer SharePoint-Bibliothek. Ich möchte mein Objekt 'Model' dem Objekt 'ListItem' zuordnen. Leider hat das Objekt 'ListItem' keinen Konstruktor und ich muss es mit einer Funktion initialisieren, die sich in der SharePoint-Bibliothek befindet. Ist es möglich, vor dem Mapping eine Instanz eines gemappten Objekts anzugeben?Übergabe der erstellten Objektinstanz an den Mapper

public void AddToList(Model model) 
    { 
     // 'new ListItem()' is fobbiden. 'CreateListItemInstance()' 
     // creates 'instance' using client context, list name which aren't 
     // inside 'model' object. 
     ListItem instance = this.CreateListItemInstance(); 

     // (Model -> ListItem) It throws exception, because automapper 
     // try to create instance of ListItem. 
     ListItem parsedItem = Mapper.Map<ListItem>(model); 

     // I would like to have something like below: 
     // Mapper.Map<ListItem>(model).UseInstance(instance); 


     this.SharePointListItemRepository.Insert(parsedItem); 
     this.SharePointListItemRepository.Save(); 
    } 

aktualisieren (12/22/2017)

I verwendet ResolutionContext Instanz zu übergeben Mapper und I verwenden diese Instanz in ConstructUsing Konstruktor-Methode mit Instanz zu ersetzen.

 ListItem instance = this.CreateListItemInstance(); 

     ListItem parsed = mapper.Map<ListItem>(model, opts => 
     opts.Items["instance"] = instance); //passing instance to ResolutioContext 

     this.SharePointListItemRepository.Insert(parsed); 
     this.Save(); 

Innen Karte Profil:

  CreateMap<Model, ListItem>() 
      //Using 'ConstructUsing' method to use instance of Model 
      //(from resolutionContext) as constructor. 
      .ConstructUsing((source, resolutionContext) => 
      (resolutionContext.Items["instance"] as ListItem)) 
      //Mappings... 
      .AfterMap((source, destination) => 
      { 
       destination["Title"] = source.Title; 
      }); 

Antwort

0

Check out this article:

Da wir nur den Typ des benutzerdefinierten Resolver AutoMapper geliefert, die Mapping-Engine Reflexion verwenden eine erstellen Instanz des Wertlösers.

Wenn wir nicht AutoMapper wollen Reflexion verwenden, um die Instanz zu erstellen, können wir es direkt beliefern:

Mapper.Initialize(cfg => cfg.CreateMap<Source, Destination>() 
    .ForMember(dest => dest.Total, 
     opt => opt.ResolveUsing(new CustomResolver()) 
    ); 

Anstelle von

opt.ResolveUsing(new CustomResolver()) 

es sein kann:

opt.ResolveUsing(CreateListItemInstance()) 
Verwandte Themen