Отображение на объекты CSLA с использованием Automapper - PullRequest
4 голосов
/ 13 апреля 2011

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

 <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 только для чтения, которое является коллекцией, унаследованной от BusinessListBaseЕдинственный способ добавить элементы в эту коллекцию - выполнить метод Assign (resourceId).

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

Спасибо!

Zen

1 Ответ

3 голосов
/ 15 апреля 2011

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

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

...