AutoMapper映射接口和忽略列

时间:2017-02-11 18:16:33

标签: c# automapper automapper-5

我有以下代码:

接口

namespace Core.Interfaces
{
    public interface ILoanApplicationBase
    {
        string ContactName { get; set; }
        string Email { get; set; }
    }
}

namespace App1.Core.Interfaces
{
    public interface ILoanApplication : ILoanApplicationBase
    {
        Guid? Id { get; set; }

        List<ILoanApplicationDebt> LoanApplicationDebts { get; set; }

        ILoanApplicationStatus LoanApplicationStatus { get; set; }

        IReadOnlyCollection<IBusinessBorrower> BusinessBorrowers { get; set; }
    }
}

namespace App2.Core.Interfaces
{
    public interface ILoanApplication : IDomainModel, ILoanApplicationBase
    {
        int? Id { get; set; }

        IReadOnlyCollection<ILoanApplicationDebt> LoanApplicationDebts { get; set; }

        ILoanApplicationStatus LoanApplicationStatus { get; set; }

        IReadOnlyCollection<IBusinessBorrower> BusinessBorrowers { get; set; }
    }
}

物件

namespace App1.Domain
{
    [Serializable]
    public class LoanApplication : ILoanApplication
    {
        public Guid? Id { get; set; }

        public List<ILoanApplicationDebt> LoanApplicationDebts { get; set; }

        public LoanApplicationStatus LoanApplicationStatus { get; set; }

        public IReadOnlyCollection<IBusinessBorrower> BusinessBorrowers { get; set; }

    }
}

namespace App2.Domain
{
    [Serializable]
    public class LoanApplication : ILoanApplication
    {
        public override int? Id { get; set; }

        public int? LoanApplicationStatusId { get; set; }

        public virtual LoanApplicationStatus LoanApplicationStatus { get; set; }

        ILoanApplicationStatus ILoanApplication.LoanApplicationStatus
        {
            get
            {
                return (ILoanApplicationStatus)LoanApplicationStatus;
            }
            set
            {
                LoanApplicationStatus = (LoanApplicationStatus)value;
            }
        }

        public virtual ICollection<LoanApplicationDebt> LoanApplicationDebts { get; set; }

        IReadOnlyCollection<ILoanApplicationDebt> ILoanApplication.LoanApplicationDebts
        {
            get
            {
                List<ILoanApplicationDebt> loanApplicationDebts = new List<ILoanApplicationDebt>();
                foreach (ILoanApplicationDebt loanApplicationDebt in this.LoanApplicationDebts)
                {
                    loanApplicationDebts.Add(loanApplicationDebt);
                }
                return loanApplicationDebts;
            }
            set
            {
                foreach (var item in value)
                {
                    this.LoanApplicationDebts.Add((LoanApplicationDebt)item);
                }
            }
        }

        public ICollection<BusinessBorrower> BusinessBorrowers { get; set; }

        IReadOnlyCollection<IBusinessBorrower> ILoanApplication.BusinessBorrowers
        {
            get
            {
                List<IBusinessBorrower> businessBorrowers = new List<IBusinessBorrower>();
                foreach(BusinessBorrower businessBorrower in BusinessBorrowers)
                {
                    businessBorrowers.Add((IBusinessBorrower)businessBorrower);
                }
               return new ReadOnlyCollection<IBusinessBorrower>(businessBorrowers);

            }
            set
            {

                foreach (IBusinessBorrower businessBorrower in value)
                {
                    BusinessBorrowers.Add((BusinessBorrower)businessBorrower);
                } 
            }
        }
    }
}

我的目标是使用Automapper从两个版本的LoanApplication之间复制公共属性。我有以下工作:

Mapper.Initialize(cfg => cfg.CreateMap<App1.Domain.LoanApplication, App2.Domain.LoanApplication>()
    .ForMember(x => x.Id, opt => opt.Ignore())
    .ForMember(x => x.LoanApplicationStatus, opt => opt.Ignore())
    .ForMember(x => x.BusinessBorrowers, opt => opt.Ignore())
    .ForMember(x => x.LoanApplicationDebts, opt => opt.Ignore()));

app2LoanApplication = Mapper.Map<LoanApplication>(app1LoanApplication);

这会正确复制所有列,但我仍然需要手动更新被忽略的属性。

ID的类型不同,所以我总是想忽略。但想知道我是如何映射LoanApplicationStatus,BusinessBorrowers和LoanApplicationDebts的。我没有发布这些定义以减少空间,但就像LoanApplicaiton一样,App1版本使用Guid而App2则使用Int for Ids。每个版本共享相同的基类,但添加了几个不同的列。

1 个答案:

答案 0 :(得分:0)

我想通了,我需要为每个对象添加额外的映射:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<App1.Domain.LoanApplication, App2.Domain.LoanApplication>()
        .ForMember(x => x.Id, opt => opt.Ignore())

    cfg.CreateMap<App1.Domain.BusinessBorrower, App2.Domain.BusinessBorrower>()
        .ForMember(x => x.Id, opt => opt.Ignore())

    cfg.CreateMap<App1.Domain.LoanApplicationDebt, App2.Domain.LoanApplicationDebt>()
        .ForMember(x => x.Id, opt => opt.Ignore());
});