7

編集:もともと私は自分の目標を達成するために AutoMapper を使用するつもりでしたが、AutoMapper はそのように動作することを意図していないことを学ばなければなりませんでした。プロファイルを作成する可能性がありますが、私の場合 (完全に構成可能)、パラメーターの組み合わせごとに 1 つのプロファイルが必要になるため、独自のアプローチを思いつきました。回答を参照してください。

AutoMapper wiki から、次のような単純なマッピングを作成することを学びました

    Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title));
    Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date));
    Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour));
    Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute));

次のような2つのクラスの場合

public class CalendarEvent
{
    public DateTime EventDate;
    public string Title;
}

public class CalendarEventForm
{
    public DateTime EventDate { get; set; }
    public int EventHour { get; set; }
    public int EventMinute { get; set; }
    public string Title { get; set; }
}

マッピングを外部で、つまり次のような XML ファイルで定義する可能性があるかどうか疑問に思っていました。

<ObjectMapping>
<mapping>
    <src>Title</src>
    <dest>Tile</dest>
</mapping>
<mapping>
    <src>EventDate.Date</src>
    <dest>EventDate</dest>
</mapping>
<mapping>
    <src>EventDate.Hour</src>
    <dest>EventHour</dest>
</mapping>
<mapping>
    <src>EventDate.Minute</src>
    <dest>EventMinute</dest>
</mapping>

その影響により、マップの作成に影響を与えます (XML は必須ではなく、他のすべてのものでもかまいません)。簡単にするために、タイプは問題ではないとします。したがって、src と dest は同じである必要があります。そうでない場合は、失敗しても問題ありません。この背後にある考え方は、何をどこにマッピングするかを非常に柔軟にすることです。その名前に基づいてプロパティ値を取得するリフレクションを考えていましたが、これはうまくいかないようです。また、これがまったく意味があるのか​​ 、それとも何か重要なものが欠けているのかわからないので、助けやアイデアをいただければ幸いです.

4

3 に答える 3

3

あなたはあなたが求めていることをしたくありません。@Gruff Bunnyが言うように、automapperには、Profile探しているすべての構成を本質的に行うクラスがすでにあります。

XML (またはその他の構成) ファイルでこれを行いたくないのはなぜですか?

まず、オートマッパー構成の厳密に型指定された性質が失われるためです。XML またはその他の種類のファイルを解析してマッピングを読み取り、CreateMapテキスト マッピングに基づいて呼び出すコードを記述できます。ただし、これを行う場合は、実行時に例外がスローされないことを確認するために、構成ごとに単体テストが本当に必要です。

次に、実行時にこれを構成したいと言っています。ただし、構成ファイルを単に置き換えるだけでは不十分です。メソッドを再度呼び出すには、通常は Web アプリケーション内CreateMapにあるエントリ ポイントが必要です。Global.asaxそのため、構成ファイルを置き換えた後も、新しい構成を有効にするためにアプリをリサイクルまたは再起動する必要があります。を置き換えたときのように自動的には起こりませんweb.config

第三に、これを行うとアプリケーションの起動時間が遅くなります。CreateMapマッピングのためにテキストを解析するよりも、CLR コードから直接呼び出しを行う方がはるかに高速です。

XML やその他の外部テキスト ファイルを使用せずに、さまざまなマッピング構成を実現するにはどうすればよいでしょうか?

AutoMapper.Profile。AutoMapper や .NET には、アプリケーションと同じアセンブリでマッピングを宣言する必要があるということは何もありません。AutoMapper.Profileこれらのマッピングを厳密に型指定された方法で定義する別のアセンブリでクラスを作成できます。Profileその後、オートマッパーをブートストラップするときにこれらのクラスをロードできます。これを簡単にするいくつかのヘルパーについては、私の github アカウントで AutoAutoMapper ライブラリを探してください。

public class CalendarEventProfile : AutoMapper.Profile
{
    public override void Configure()
    {
        CreateMap<CalendarEvent, CalendarEventForm>()
            //.ForMember(d => d.Title, o => o.MapFrom(s => s.Title)) //redundant, not necessary
            .ForMember(d => d.EventDate, o => o.MapFrom(s => s.EventDate.Date))
            .ForMember(d => d.EventHour, o => o.MapFrom(s => s.EventDate.Hour))
            .ForMember(d => d.EventMinute, o  => o.MapFrom(s => s.EventDate.Minute))
        ;
    }
}

このクラスを作成することにより、XML ファイルに配置する場合と同じ方法でマッピング構成を本質的に外部化できます。最大かつ最も有利な違いは、これが型安全であるのに対し、XML 構成はそうではないことです。そのため、デバッグ、テスト、および保守がはるかに簡単になります。

于 2013-10-07T11:29:35.253 に答える