2011-04-13 2 views
4

J'essaie de mapper un objet DTO à un objet CSLA.NET (voir: http://www.lhotka.net/cslanet/). Par souci de cette question, j'utilise l'exemple d'application fourni par Lhotka avec son framework. Ci-dessous un exemple de classes que je utilise (j'ai enlevé la majorité des propriétés et méthodes pour plus de clarté):Mappage aux objets CSLA à l'aide d'Automapper

<Serializable()> _ 
    Public Class Project 
     Inherits BusinessBase(Of Project) 


     Private mId As Guid = Guid.NewGuid 
     Private mName As String = "" 

     Private mResources As ProjectResources = _ 
      ProjectResources.NewProjectResources() 

     <System.ComponentModel.DataObjectField(True, True)> _ 
     Public ReadOnly Property Id() As Guid 
      <System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _ 
      Get 
       'CanReadProperty(True) 
       Return mId 
      End Get 
     End Property 


     Public Property Name() As String 
      <System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _ 
      Get 
       'CanReadProperty(True) 
       Return mName 
      End Get 
      <System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _ 
      Set(ByVal Value As String) 
       'CanWriteProperty(True) 
       If Value Is Nothing Then Value = "" 
       If mName <> Value Then 
        mName = Value 
        PropertyHasChanged() 
       End If 
      End Set 
     End Property 



     Public ReadOnly Property Resources() As ProjectResources 
      Get 
       Return mResources 
      End Get 
     End Property 


    End Class 




    Public Class ProjectDTO 


     Private _id As Guid 
     Public Property Id() As Guid 
      Get 
       Return _id 
      End Get 
      Set(ByVal value As Guid) 
       _id = value 
      End Set 
     End Property 



     Private _name As String 
     Public Property Name() As String 
      Get 
       Return _name 
      End Get 
      Set(ByVal value As String) 
       _name = value 
      End Set 
     End Property 


     Private _resources As New List(Of ProjectResourceDTO)() 
     Public Property MyResources() As List(Of ProjectResourceDTO) 
      Get 
       Return _resources 
      End Get 
      Set(ByVal value As List(Of ProjectResourceDTO)) 
       _resources = value 
      End Set 
     End Property 

    End Class 


Mapper.CreateMap(Of ProjectDTO, Project)().ConstructUsing(Function(src As ProjectDTO) Project.NewProject()) 
Mapper.CreateMap(Of ProjectResourceDTO, ProjectResource)() 
Mapper.CreateMap(Of ResourceDTO, Resource)() 

La question que je ressentais est liée à la cartographie des ressources propriété en lecture seule qui est une collection héritant de BusinessListBase. La seule façon d'ajouter des éléments à cette collection consiste à exécuter la méthode Assign (resourceId).

Est-ce que quelqu'un a une idée sur la façon dont je peux mapper l'objet DTO à l'objet CSLA. C'est à dire. Comment dois-je configurer le mappeur? Veuillez noter que l'utilisation d'un résolveur pour le membre Resources n'a pas aidé dans ce cas particulier.

Merci!

Zen

Répondre

3

Automapper ne va pas vous aider ici, car il ne peut appeler les API publiques.

Utilisez le codage CSLA.NET standard pour construire votre liste ProjectResources à partir des DTO. Tout en chargeant chaque ProjectResource, vous devriez appeler le LoadProperty<T>(IPropertyInfo pi, T value) pour remplir chaque propriété, conformément à la convention de l'AAPC.

+1

Merci Ed! Je doutais vraiment qu'il y aurait une solution pour cela. CSLA.NET a sa propre façon de faire les choses. Malheureusement, je n'ai pas assez de réputations pour vous accepter de répondre ... – UncleZen