3

スタンドアロン アセンブリとして配布するように設計された .Net 4 ライブラリをまとめています。ライブラリの一部は、いくつかのアドホック Web サービス呼び出しを行います。この呼び出しでは、投影されたバージョンの をライブラリのコンシューマに返す予定です。Web サービスの応答表現と、ライブラリのコンシューマーが実際に取得するものとの間で、大量のマッピングを行う必要があります。このタスクにAutoMapperを活用したいと考えています。多くの場合、慣習は、退屈な右から左へのマッピング コードの多くを処理してくれます。

たとえば、私のライブラリは次のようなコードを公開する可能性があります。

public Widget GetWidget(Guid id)
{
    // Get server representation
    ServerWidget serverWidget = this.Request<ServerWidget>(id);

    // Map to client representation
    Widget clientWidget = Mapper.Map<ServerWidget, Widget>(serverWidget);

    return clientWidget;
}

コードの他の場所では、明らかに呼び出す必要があります (さらに、マッピング用のカスタム構成):

Mapper.CreateMap<ServerWidget, Widget>();

AutoMapper の設計ガイドラインに従って、これは AppDomain ごとに 1 回だけ実行する必要があります (コストのかかる操作であるため)。このライブラリはあらゆる環境 (ASP.NET、WinForms アプリ、WPF アプリ、単体テスト ランナーなど) で使用できるため、このような状況でマップを適切に設定するにはどうすればよいでしょうか?

明らかに、私のコードは、クライアントが「ものを初期化する」ために呼び出すためのある種のメソッド(この場合はマッパー)を公開し、アプリケーションの起動プロセスの適切なタイミングで実際にその呼び出しを行ったと想定できますが、それはライブラリの消費者に課すには、本当に不十分な要件です。

誰かが私に何か提案をしたり、GitHub、Codeplex などで既にこのようなことを行っているオープンソース プロジェクトを教えてくれませんか?

4

2 に答える 2

2

.Netの静的コンストラクター機能を利用することもできます。クラスに静的コンストラクターを追加し、マップの作成を追加します。CLR により、AppDomain ごとに静的コンストラクターを 1 回だけ実行できることが保証されるため、ロックは必要ありません。AutoMapper.MapperAppDomainごとに1つである静的マッパー( )を使用しているため、これで十分です。

于 2012-07-14T18:54:21.787 に答える
2

ライブラリに静的な IsMappingInitialized メソッドを用意してから、このようなマッピングを行う前に確認してください。これはスレッドセーフです。

private static readonly object MappingLock = new object();
private static bool _ready = false;

public static bool IsMappingInitialised()
{
    if (!_ready)
    {
        lock (MappingLock)
        {
            if (!_ready)
            {
                Mapper.CreateMap<ServerWidget, Widget>();
                _ready = true;
            }
        }
    }

    return _ready;
}

そうすれば、初期化を実行するために消費者に依存する必要がなくなります。

于 2012-06-29T11:01:18.997 に答える