我有一个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依次调用它们,但是第二个总是会覆盖第一个的配置。我需要知道我是否正确地这样做了。感谢。
答案 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
}
}