alex
alex

Reputation: 1350

How to map objects

Here is my how my bindings currently look:

MerchantAccountRequest request = new MerchantAccountRequest
                {
                    Individual = new IndividualRequest
                    {
                        FirstName = merchant.MerchantIndividual.FirstName,
                        LastName = merchant.MerchantIndividual.LastName,
                        Email = merchant.MerchantIndividual.Email,
                        Phone = merchant.MerchantIndividual.Phone,
                        DateOfBirth = merchant.MerchantIndividual.DateOfBirth,
                        Ssn = merchant.MerchantIndividual.Ssn,
                        Address = new AddressRequest
                        {
                            StreetAddress = merchant.MerchantIndividual.StreetAddress,
                            Locality = merchant.MerchantIndividual.Locality,
                            Region = merchant.MerchantIndividual.Region,
                            PostalCode = merchant.MerchantIndividual.PostalCode
                        }
                    },
                    Business = new BusinessRequest
                    {
                        LegalName = merchant.MerchantBusiness.LegalName,
                        DbaName = merchant.MerchantBusiness.DbaName,
                        TaxId = merchant.MerchantBusiness.TaxId,
                        Address = new AddressRequest
                        {
                            StreetAddress = merchant.MerchantBusiness.StreetAddress,
                            Locality = merchant.MerchantBusiness.Locality,
                            Region = merchant.MerchantBusiness.Region,
                            PostalCode = merchant.MerchantBusiness.PostalCode
                        }
                    },
                    Funding = new FundingRequest
                    {
                        Descriptor = merchant.MerchantFunding.Descriptor,
                        Destination = FundingDestination.BANK,
                        Email = merchant.MerchantFunding.Email,
                        MobilePhone = merchant.MerchantFunding.MobilePhone,
                        AccountNumber = merchant.MerchantFunding.AccountNumber,
                        RoutingNumber = merchant.MerchantFunding.RoutingNumber
                    },
                    TosAccepted = merchant.TosAccepted,
                    MasterMerchantAccountId = merchant.MasterMerchantAccountId,
                    Id = merchant.MerchantId
                };

And I need to use AutoMapper to achieve the above.

This is what I've tried:

CreateMapperProfile

EDIT:

    CreateMap<Classes.Merchant, MerchantAccountRequest>()
        .ForMember(dest => dest.Individual, source => source.MapFrom(s => s.MerchantIndividual))
        .ForMember(dest => dest.Business, source => source.MapFrom(s => s.MerchantBusiness))
        .ForMember(dest => dest.Funding, source => source.MapFrom(s => s.MerchantFunding))
        .ForMember(dest => dest.Id, source => source.MapFrom(s => s.MerchantId));

Here is the Merchant class:

public partial class Merchant :
    {
        public int Id { get; set; }
        public string MerchantId { get; set; }
        public virtual MerchantIndividual MerchantIndividual { get; set; }
        public virtual MerchantBusiness MerchantBusiness { get; set; }
        public virtual MerchantFunding MerchantFunding { get; set; }
        public bool TosAccepted { get; set; }
        public string MasterMerchantAccountId { get; set; }
        public bool isSubMerchant { get; set; }
     }

And the mappings;

EDIT:

        MerchantAccountRequest request = _mapper.Map<MerchantAccountRequest>(merchant);
        request.Individual = _mapper.Map<IndividualRequest>(merchant.MerchantIndividual);
        request.Business = _mapper.Map<BusinessRequest>(merchant.MerchantBusiness);
        request.Funding = _mapper.Map<FundingRequest>(merchant.MerchantFunding);

Can the first line of code MerchantAccountRequest request = _mapper.Map<MerchantAccountRequest>(merchant); above do all the mapings?

.. .. .. ..

How can I create the correct mappings?

Upvotes: 0

Views: 68

Answers (1)

MisterIsaak
MisterIsaak

Reputation: 3922

You don't need to call _mapper.Map on the properties of the request.

Just call MerchantAccountRequest request = _mapper.Map<MerchantAccountRequest>(merchant); and assuming you have a map for each type you should be fine.

I think something along the lines of the following should get you going down the right path.

class Program
{
    static void Main(string[] args)
    {
        var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<Merchant, MerchantAccountRequest>()
                .ForMember(dest => dest.Individual, c => c.MapFrom(source => source.MerchantIndividual));
            cfg.CreateMap<MerchantIndividual, IndividualRequest>();
        });

        config.AssertConfigurationIsValid();
        var mapper = config.CreateMapper();

        var merchant = new Merchant
        {
            Id = 1,
            MerchantIndividual = new MerchantIndividual { FirstName = "John Doe" }
        };

        var merchantAccountRequest = mapper.Map<Merchant, MerchantAccountRequest>(merchant);            
    }
}

public class Merchant
{
    public int Id { get; set; }
    public MerchantIndividual MerchantIndividual { get; set; }
}

public class MerchantIndividual
{
    public string FirstName { get; set; }
}

public class MerchantAccountRequest
{
    public int Id { get; set; }
    public IndividualRequest Individual { get; set; }
}

public class IndividualRequest
{
    public string FirstName { get; set; }
}

Upvotes: 2

Related Questions