AutoMapper(C#のDTO詰め替めライブラリ)
今日はいいかなと思ってたのですが、昼休みに面白そうなライブラリを見つけたので書きます。
AutoMapperというオープンソース(Apache License)です。バージョンは0.3.1Betaですが、ダウンロード数が1700件と評価は良いようです。このライブラリは、複数のDTOを1つのDTOにしたり、DTOのカラムから新しいカラムを作ったりできます。DTOの詰め替えをするだけなんですが、特徴としては、属性(アノテーション)を使うのではなく、コード中でDTOへの変換設定を書きます。
CodePlexのサンプルを抽出するとこんな感じです。
まず複数のDTOから1つのDTOに詰め替えるケースです(コード中のMapperというのは、AutoMapperの本体です)。
//Customerクラス、Orderクラス、Productクラスから、OrderDtoを生成 var customer = new Customer { Name = "George Costanza" }; var order = new Order { Customer = customer }; var bosco = new Product { Name = "Bosco", Price = 4.99m }; order.AddOrderLineItem(bosco, 15); // AutoMapperの設定 Mapper.CreateMap<Order, OrderDto>(); // AutoMapperの実行&DTOのテスト OrderDto dto = Mapper.Map<Order, OrderDto>(order); dto.CustomerName.ShouldEqual("George Costanza"); dto.Total.ShouldEqual(74.85m);
次にオブジェクトから項目を算出して詰め替えるケースです。
//日付時刻型しかもたないCalendarEventクラスから、 //年月日、時刻、分のプロパティを持つCalendarEventFormクラスに展開 var calendarEvent = new CalendarEvent { EventDate = new DateTime(2008, 12, 15, 20, 30, 0), Title = "Company Holiday Party" }; // AutoMapperの設定(CalendarEventFormクラスのプロパティをどのように計算するか設定) Mapper.CreateMap<CalendarEvent, CalendarEventForm>() .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date)) .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour)) .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute)); // マッピング&テスト CalendarEventForm form = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent); form.EventDate.ShouldEqual(new DateTime(2008, 12, 15)); form.EventHour.ShouldEqual(20); form.EventMinute.ShouldEqual(30); form.Title.ShouldEqual("Company Holiday Party");
.NET開発では、以前はDataTable/DataSetを使ってリッチなUIコントロールにバインドすることが多かったので、DTOを詰め替えるケースというのはそれほど無かったのですが、最近は、ASP.NET MVCでのビューや、MVP(Model View Presenter)パターンでのバインドなど、POJO(PONO)を使うことが.NET開発でも増えているように思います。そんな中で、こういうライブラリは役に立つのではないかと思います。
ちなみに、規約と属性を使って変換を行うライブラリとしてはS2DXOがあります。
- 追記2009/09/06