AutoMapper - 多类库

时间:2016-01-07 16:22:07

标签: asp.net automapper class-library

我有一个ASP.NET Web窗体应用程序和一个ClassLibrary,它们都定义了自己的AutoMapper.Profiles类。一个例子是:

public class MyMappings : AutoMapper.Profile
{
    public MyMappings() : base("MyMappings")
    {
    }

    protected override void Configure()
    {
        Mapper.CreateMap<DAL.User, SessionUser>()
            .ForMember(
                dest => dest.LocationName,
                opt => opt.MapFrom(src => src.LocationForUser.Name));
    }
}

为了配置BOTH映射并且为了使一个映射配置文件不覆盖其他映射配置文件,我应该只有一个AutoMapperConfig(在ASP.NET Forms Application中定义)如下:?

namespace PlatformNET.Mappings
{
public class AutoMapperConfig
{
    public static void Configure()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<MyMappings>();
            x.AddProfile<AssessmentClassLib.Mappings.MyMappings>();
        });

    }
}
}

并从Global.asax调用一次,如下所示?

void Application_Start(object sender, EventArgs e)
{
    PlatformNET.Mappings.AutoMapperConfig.Configure();
}

我目前在Web App和Class Library中都有一个AutoMapperConfig类,我从Global.asax依次调用它们,但是第二个总是会覆盖第一个的配置。我需要知道我是否正确地这样做了。感谢。

1 个答案:

答案 0 :(得分:0)

配置文件本身并不会相互覆盖,但每次调用Mapper.Initialize都会重置以前的任何AutoMapper配置文件。您应该只拨打Mapper.Initialize一次。

以下代码说明了这一点:

class Program
{
    static void Main(string[] args)
    {
        CallInitOnce();

        Mapper.Reset();

        CallInitTwice();
    }

    static void CallInitOnce()
    {
        // add profiles one time
        Mapper.Initialize(x =>
        {
            x.AddProfile<ClassAToClassBProfile>();
            x.AddProfile<EmptyProfile>();
        });

        var classA = new ClassA()
        {
            MyProperty = 2
        };

        var classB = Mapper.Map<ClassB>(classA);

        Debug.Assert(classA.MyProperty == classB.MyProperty); // profiles work together
    }

    static void CallInitTwice()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<ClassAToClassBProfile>();
        });

        // previous mapping profile is lost
        Mapper.Initialize(x =>
        {
            x.AddProfile<EmptyProfile>(); 
        });

        var classA = new ClassA()
        {
            MyProperty = 2
        };
        var classB = Mapper.Map<ClassB>(classA);

        Debug.Assert(classA.MyProperty == classB.MyProperty); // this will fail
    }
}