قبل ازاین مقاله، درباره راه اندازی و استفاده از کتابخانه Automapper بحث شده ولی موردی که شاید کمتر به آن توجه شده سرعت این نگاشت میباشد. در این مقاله با استفاده از نوشتن تست، این موضوع بررسی میشود.
کلاس ساده زیر را در نظر بگیرید که
برای مثال از سمت لایه دسترسی به داده گرفته شده است:
public enum PersonType { Real =0, Legal=1 } public class Person { public long PersonId { get; set; } public string Name { get; set; } public string Family { get; set; } public PersonType PersonType { get; set; } public Person(long personId, string name, string family, PersonType personType) { PersonId = personId; Name = name; Family = family; PersonType = personType; } }
از سازنده آن برای دریافت مقادیر مربوط به خصوصیات شیء استفاده شد.
در طرف دیگر نیز کلاسی برای نگاشت از آبجکت رسیده از سمت لایه داده ساخته میشود که برای نمایش در ویوها ایجاد شده است:
public class PersonDto { public long PersonId { get; set; } public string Name { get; set; } public string Family { get; set; } public PersonType PersonType { get; set; } public PersonDto(long personId, string name, string family, PersonType personType) { PersonId = personId; Name = name; Family = family; PersonType = personType; } }
همانطور که مشاهده میکنید در سازنده این کلاس نیز مقادیر خصوصیات، دریافت شدهاست.
برای ایجاد لیستی که در تست مورد استفاده قرار میگیرد نیز کلاس زیر را فراهم میکنیم:
public class PersonList { readonly List<Person> _list = new List<Person>(); public ReadOnlyCollection<Person> GetPersons() { if (!_list.Any()) { for (int i = 0; i < 100*1000; i++) { _list.Add(new Person(i + 1, "Person Name" + i, "Person Family" + i, (PersonType)(i % 2))); } } return _list.AsReadOnly(); } }
در اینجا برای
محسوس بودن نتیجه تست میتوان تعداد آبجکتهای لازم برای تست را تعیین کرد، فعلا 100
هزار آبجکت در نظر گرفته شده است:
for (int i = 0; i < 100*1000; i++) { _list.Add(new Person(i + 1, "Person Name" + i, "Person Family" + i, (PersonType)(i % 2))); }
برای
ارجاع به AutoMapper، با
استفاده از نیوگت، پکیج را به پروژه تست
ارجاع میدهیم: (در حال حاضر نسخه 5.1.1 استفاده شده است)
<package id="AutoMapper" version="5.1.1" targetFramework="net452" />
در سمت
تست نگاشت نیز از دو متد برای مقایسه استفاده میکنیم؛ یکی با استفاده از AutoMapper و دیگری بدون استفاده از آن:
[TestMethod] public void FillPersonDtoList_AutoMapperShouldMapPersonListToPersonDtoList_WhenLargeAmountOfPerson() { // arrange var personDtoList = new List<PersonDto>(); persons = new PersonList().GetPersons(); // act personDtoList = Mapper.Map<List<PersonDto>>(persons); //assert Assert.AreEqual(persons.Count, personDtoList.Count); } [TestMethod] public void FillPersonDtoList_UsingHandlyAssignment_WhenLargeAmountOfPerson() { // arrange var personDtoList = new List<PersonDto>(); persons = new PersonList().GetPersons(); // act foreach (var person in persons) { personDtoList.Add(new PersonDto(person.PersonId, person.Name, person.Family, person.PersonType)); } //assert Assert.AreEqual(persons.Count, personDtoList.Count); }
سرعت
نگاشت AutoMapper در نسخه حال حاضر تقریبا سه بار کندتر از استفاده معمول برای تهیه نگاشت
جدید از یک آبجکت است:
نکته: این تست با نسخه قدیمی تر(4.0.4.0) نیز انجام شده که این اختلاف سرعت نزدیک به 13 بار کندتر هم رسیده است.
پ.ن: سورس پروژه تست