読者です 読者をやめる 読者になる 読者になる

AutoMapper(C#のDTO詰め替めライブラリ)

.net oss

今日はいいかなと思ってたのですが、昼休みに面白そうなライブラリを見つけたので書きます。

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があります。