#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 имеет свой собственный способ выполнения действий. К сожалению, у меня недостаточно репутации, чтобы принять ваш ответ…