Сопоставление с объектами CSLA с помощью Automapper

#mapping #automapper #dto #csla

#сопоставление #automapper #dto #csla

Вопрос:

Я пытаюсь сопоставить объект DTO с CSLA.NET (смотрите: http://www.lhotka.net/cslanet /) объект. Ради этого вопроса я использую пример приложения, которое Lhotka предоставляет вместе со своим фреймворком. Ниже приведен пример классов, которые я использую (я удалил большинство свойств и методов для наглядности):

  <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)()
  

Проблема, с которой я сталкиваюсь, связана с сопоставлением свойства Resources readonly, доступного только для чтения, которое является коллекцией, наследуемой от BusinessListBase. Единственный способ добавить элементы в эту коллекцию — выполнить метод Assign(resourceId).

У кого-нибудь есть идея относительно того, как я могу сопоставить объект DTO обратно с объектом CSLA. Т.Е. Как я должен настроить сопоставитель? Пожалуйста, обратите внимание, что использование преобразователя для элемента Resources не помогло в этом конкретном случае.

Спасибо!

Zen

Ответ №1:

Automapper здесь вам не поможет, потому что он может вызывать только общедоступные API.

Используйте обычный CSLA.NET кодирование для построения вашего ProjectResources списка из DTO. Во время загрузки каждого из них ProjectResource вы должны вызывать LoadProperty<T>(IPropertyInfo pi, T value) для заполнения каждого свойства в соответствии с соглашением CSLA.

Комментарии:

1. Спасибо Ed! Я очень сомневался, что для этого найдется решение. CSLA.NET имеет свой собственный способ выполнения действий. К сожалению, у меня недостаточно репутации, чтобы принять ваш ответ…