2013-06-08 29 views
7

Tôi có hai thực thể: tự & OrderDTO Và tôi đang sử dụng AutoMapper để lập bản đồ chúng lại với nhau.quy tắc ánh xạ khác nhau cho các loại thực thể tương tự trong AutoMapper

Dựa trên một số điều kiện Tôi muốn các đối tượng này là ánh xạ khác nhau.

Thực tế tôi muốn hai hoặc nhiều quy tắc ánh xạ khác nhau (CreateMap) cho các thực thể này.

Và khi gọi Map chức năng Tôi muốn nói với công cụ quy tắc ánh xạ nào để sử dụng.

Nhờ câu hỏi này: Using the instance version of CreateMap and Map with a WCF service? một cách tiếp cận được sử dụng một trường hợp khác nhau của ánh xạ vì vậy mỗi một lon đã nó quy tắc ánh xạ riêng:

var configuration = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 
var mapper = new MappingEngine(configuration); 
configuration.CreateMap<Dto.Ticket, Entities.Ticket>() 

Bạn có bất cứ giải pháp tốt hơn?

Như đã đề cập bởi Jimmy Bogard (Đấng Tạo Hóa của AutoMapper) đây: Using Profiles in Automapper to map the same types with different logic:

Bạn nên tạo các đối tượng cấu hình riêng biệt, và tạo MappingEngine riêng cho mỗi người. Lớp Mapper chỉ đơn thuần là mặt tiền tĩnh trên mỗi mặt, với một số vòng đời quản lý.

Quản lý vòng đời cần phải làm gì?

+0

Tôi đang cố gắng tìm ra điều tương tự. Tôi đã nhìn thấy câu trả lời đó nhưng tôi không hiểu cách nó hoạt động. Hy vọng ai đó có thể giúp đỡ. Chúc mừng. – LeftyX

+0

@LeftyX: kiểm tra câu trả lời của tôi. –

Trả lời

3

Tôi đã kết thúc việc tạo một phiên bản mới của trình ánh xạ và lưu vào bộ nhớ cache trong một từ điển đồng thời (tĩnh) được chia sẻ.

đây là mã của tôi (vb.net):

nhà máy mapper:

Public Function CreateMapper() As IMapper Implements IMapperFactory.CreateMapper 
      Dim nestedConfig = New ConfigurationStore(New TypeMapFactory, MapperRegistry.Mappers) 
      Dim nestedMapper = New MappingEngine(nestedConfig) 
      Return New AutomapperMapper(nestedConfig, nestedMapper) 
End Function 

cấu hình khác nhau cho các kịch bản khác nhau:

Private Shared _mapperInstances As New Concurrent.ConcurrentDictionary(Of String, IMapper) 

Public Shared ReadOnly Property Profile(profileName As String) As IMapper 
      Get 
       Return _mapperInstances.GetOrAdd(profileName, Function() _mapperFactory.CreateMapper) 
      End Get 
End Property 

và lớp mapper:

Friend Class AutomapperMapper 
     Implements IMapper 

     Private _configuration As ConfigurationStore 
     Private _mapper As MappingEngine 

     Public Sub New() 
      _configuration = AutoMapper.Mapper.Configuration 
      _mapper = AutoMapper.Mapper.Engine 
     End Sub 

     Public Sub New(configuration As ConfigurationStore, mapper As MappingEngine) 
      _configuration = configuration 
      _mapper = mapper 
     End Sub 

     Public Sub CreateMap(Of TSource, TDestination)() Implements IMapper.CreateMap 
      _configuration.CreateMap(Of TSource, TDestination)() 
     End Sub 

     Public Function Map(Of TSource, TDestination)(source As TSource, destination As TDestination) As TDestination Implements IMapper.Map 
      Return _mapper.Map(Of TSource, TDestination)(source, destination) 
     End Function 

     Public Function Map(Of TSource, TDestination)(source As TSource) As TDestination Implements IMapper.Map 
      Return _mapper.Map(Of TSource, TDestination)(source) 
     End Function 


    End Class 
1

Tôi c ame trên cùng một vấn đề và tôi thấy rằng AutoMapper được nâng cấp lên 4.2.0 một tháng trước, bắt đầu bằng support instances mappers được tạo bởi các cấu hình khác nhau và các hàm bản đồ tĩnh được đánh dấu là lỗi thời. Vì vậy, chúng tôi không cần phải thực hiện bởi chính chúng ta từ bây giờ!

+0

Cảm ơn những người đứng đầu. Chúc mừng. –