11

Order と OrderDTOの 2 つのエンティティがあり、 AutoMapperを使用してそれらを一緒にマップしています。

いくつかの条件に基づいて、これらのエンティティを別の方法でマッピングしたいと考えています。

実際、これらのエンティティに対して2 つ以上の異なるマッピング ルール( ) が必要です。CreateMap

また、関数を呼び出すときに、使用するマッピング ルールをMapエンジンに伝えたいと考えています。

この質問のおかげで: WCF サービスで CreateMap と Map のインスタンス バージョンを使用していますか? 1つのアプローチは、マッパーの異なるインスタンスを使用することで、それぞれが独自のマッピングルールを持つことができます:

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

より良い解決策はありますか?

Jimmy Bogard (AutoMapper の作成者)がここで述べたように: Using Profiles in Automapper to map the same types with different logic :

個別の Configuration オブジェクトを作成し、それぞれに個別の MappingEngine を作成することをお勧めします。Mapper クラスは、ライフサイクル管理を備えた、それらのそれぞれに対する単なる静的ファサードです。

どのようなライフサイクル管理を行う必要がありますか?

4

2 に答える 2

3

マッパーの新しいインスタンスを作成し、それらを共有(静的)同時実行辞書にキャッシュすることになりました。

ここに私のコード(vb.net)があります:

マッパーファクトリー:

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

さまざまなシナリオのさまざまなプロファイル:

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

そしてマッパークラス:

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
于 2014-06-10T22:31:08.540 に答える
2

同じ問題に遭遇し、1 か月前にAutoMapperが 4.2.0 にアップグレードされ、さまざまな構成で作成されたインスタンス マッパーのサポートが開始され、静的マッパー関数が廃止されたことがわかりました。したがって、今後は自分で実装する必要はありません。

于 2016-02-16T13:34:08.370 に答える