AutoMapper – a fluent configuration API to define an object-object mapping strategy

Trong bài lần trước nói về fluent interface. Lần này mình giới thiệu 1 API theo hướng “fluent” dùng để map giữa các object với nhau.

Chi tiết về AutoMapper, bạn có thể xem tại đây.

Ta đi vào ví dụ cho dễ hình dung.

 

Giả sử bạn có StudentRepository để lấy về chi tiết sinh viên.

  public override Student GetItem(int id)
  {
           

  }

Bạn dùng LINQ2SQL để lấy về chi tiết sinh viên như sau:

var context = new StudentCardDBMappings.StudentCardDBDataContext();

context.Connection.Open();

var studentLinq = (from s in context.Students
                   where s.Id.Equals(id)
                   select s).FirstOrDefault();

 

Nhưng LINQ2SQL sẽ trả về Entity mà Linq2Sql sinh ra, không phải Entity của ta mong đợi (Entity mong đợi có thể là DTO, custom entity mà support validating hoặc là business object,… ). Do đó ta phải convert từ Entity  của Linq2Sql sang Entity của ta:

 

1) Cách cổ điển: Gọi Set, Get của các thuộc tính của entity:

 var student = new Student
          {
              Id = studentLinq.Id,
              Name = studentLinq.Name,
              MidleName = studentLinq.MidleName
          };

2) Dùng AutoMapper: trong trường hợp này, AutoMapper sẽ tự động map các thuộc tính cho các entity ta cần dùng. Dùng AutoMapper như sau:

a) Config source và destination cần phải map

 Mapper.Initialize
         (
             cfg => cfg.CreateMap<StudentCardDBMappings.Student, Student>()
         );

b) Gọi hàm map để AutoMapper tự động map các thuộc tính của source và destination (trường hợp này là mặc đinh,..)

var student = Mapper.Map<StudentCardDBMappings.Student, Student>(studentLinq);

Kết quả, nếu dùng AutoMapper ta có hàm như sau:

public override Student GetItem(int id)
{


	var context = new StudentCardDBMappings.StudentCardDBDataContext();
	
	context.Connection.Open();
	
	var studentLinq = (from s in context.Students
						where s.Id.Equals(id)
						select s).FirstOrDefault();
	
	//var student = new Student
	//        {
	//            Id = studentLinq.Id,
	//            Name = studentLinq.Name,
	//            MidleName = studentLinq.MidleName
	//        };
	
	Mapper.Initialize
		(
			cfg => cfg.CreateMap<StudentCardDBMappings.Student, Student>()
		);
	
	var student = Mapper.Map<StudentCardDBMappings.Student, Student>(studentLinq);
	
	return student;

}

Và đây là kết quả Unit Test:

– Test Null

image

– Test có giá trị:

image

Chi tiết về AutoMapper, mời các bạn tham khảo tại: http://automapper.codeplex.com/

One thought on “AutoMapper – a fluent configuration API to define an object-object mapping strategy

Leave a comment