استفاده از UseValue و ResolveUsing در AutoMapper


استفاده از UseValue و ResolveUsing در AutoMapper

در AutoMapper دو متد با نام‌ های UseValue و ResolveUsing وجود دارد. متد UseValue سعی می کند که مقدار مربوط به یک property برای نگاشت شدن را در اولین اجرای برنامه کسب کند و پس از آن از آن استفاده نماید. این در حالی است که متد ResolveUsing در زمان run-time و یا اجرا شدن برنامه عمل خواهد کرد.

برای درک هر چه بهتر تفاوت مربوط به این دو متد، به کد زیر نگاهی بیندازید.

using AutoMapper;

namespace AutoMapperDemo

{

class Program

{

static void Main(string[] args)

{

InitializeAutomapper();

A aObj = new A()

{

Name = "Pranaya",

AAddress = "Mumbai"

};

var bObj = Mapper.Map<A, B>(aObj);

Console.WriteLine("After Mapping : ");

//Here FixedValue and DOJ will be empty for aObj

Console.WriteLine("aObj.Member : " + aObj.Name + ", aObj.FixedValue : " + aObj.FixedValue + ", aObj.DOJ : " + aObj.DOJ + ", aObj.AAddress : " + aObj.AAddress);

Console.WriteLine("bObj.Member : " + bObj.Name + ", bObj.FixedValue : " + bObj.FixedValue + ", bObj.DOJ : " + bObj.DOJ + ", bObj.BAddress : " + bObj.BAddress);

bObj.Name = "Rout";

bObj.BAddress = "Delhi";

Mapper.Map(bObj, aObj);

Console.WriteLine("After ReverseMap : ");

Console.WriteLine("aObj.Member : " + aObj.Name + ", aObj.FixedValue : " + aObj.FixedValue + ", aObj.DOJ : " + aObj.DOJ + ", aObj.AAddress : " + aObj.AAddress);

Console.WriteLine("bObj.Member : " + bObj.Name + ", bObj.FixedValue : " + bObj.FixedValue + ", bObj.DOJ : " + bObj.DOJ + ", bObj.BAddress : " + bObj.BAddress);

Console.ReadLine();

}

static void InitializeAutomapper()

{

Mapper.Initialize(config =>

{

config.CreateMap<A, B>()

.ForMember(dest => dest.BAddress, act => act.MapFrom(src => src.AAddress))

//To Store Static Value use the UseValue() method

.ForMember(dest => dest.FixedValue, act => act.UseValue("Hello"))

//To Store DateTime value use ResolveUsing() method

.ForMember(dest => dest.DOJ, act => act.ResolveUsing(src =>

{

return DateTime.Now;

}))

.ReverseMap();

});

}

}

public class A

{

public string Name { get; set; }

public string AAddress { get; set; }

public string FixedValue { get; set; }

public DateTime DOJ { get; set; }

}

public class B

{

public string Name { get; set; }

public string BAddress { get; set; }

public string FixedValue { get; set; }

public DateTime DOJ { get; set; }

}

}

با اجرا کردن این برنامه خروجی مورد نظر را دریافت خواهید کرد.

دقت کنید که ما می توانیم به راحتی از متد MapFrom(s => s.MemberName) به منظور برگرداندن یک property از درون source object استفاده کنیم. این در حالی است که می بایست از متد UseValue زمانی استفاده کرد که می خواهیم یک مقدار static را در mapping شرکت بدهیم و می‌دانید که این مقدار تغییر نخواهد کرد. ضمناً، با استفاده از دستور ResolveUsing(s => {}) زمانی استفاده می کنیم که می خواهیم یک property در destination type را که از یک مقدار محاسبه شده به دست بیاوریم.

از این متد باید در نگاشت هایی که بر روی date time و یا توابع نگاشت پیچیده‌تر لحاظ می شوند استفاده کنیم.

بررسی Null Substitution در Automapper

مکانیزم Null Substitution به راحتی به ما امکان این را می دهد تا یک مقدار جایگزین در destination type در زمان null بودن یک property در source type لحاظ کنیم. به عبارت دیگر، به جای اینکه یک مقدار null از source type به درون destination type برود به راحتی می توانیم آن مقدار null را با استفاده از متد NullSubstitute جایگزین کنیم. لطفاً برای هرچه بهتر این متد نگاهی به کد زیر بیندازید.

using AutoMapper;

namespace AutoMapperDemo

{

class Program

{

static void Main(string[] args)

{

InitializeAutomapper();

A aObj = new A()

{

Name = "Pranaya",

AAddress = null

};

var bObj = Mapper.Map<A, B>(aObj);

Console.WriteLine("After Mapping : ");

//Here FixedValue and DOJ will be empty for aObj

Console.WriteLine("aObj.Member : " + aObj.Name + ", aObj.FixedValue : " + aObj.FixedValue + ", aObj.AAddress : " + aObj.AAddress);

Console.WriteLine("bObj.Member : " + bObj.Name + ", bObj.FixedValue : " + bObj.FixedValue + ", bObj.BAddress : " + bObj.BAddress);

Console.ReadLine();

}

static void InitializeAutomapper()

{

Mapper.Initialize(config =>

{

config.CreateMap<A, B>()

.ForMember(dest => dest.BAddress, act => act.MapFrom(src => src.AAddress))

//You need to use NullSubstitute method to substitute null value

.ForMember(dest => dest.FixedValue, act => act.NullSubstitute("Hello"))

.ForMember(dest => dest.BAddress, act => act.NullSubstitute("N/A"));

});

}

}

public class A

{

public string Name { get; set; }

public string AAddress { get; set; }

public string FixedValue { get; set; }

}

public class B

{

public string Name { get; set; }

public string BAddress { get; set; }

public string FixedValue { get; set; }

}

}

با اجرا کردن این برنامه خروجی مورد نظر را دریافت خواهید کرد.

منبع:وبسایت پرووید