我不会对问题2说话,因为它真的是个人偏好,但对于1我通常使用一个或多个AutoMapper.Profile
来为特定目的(domaintoviewmodel等)保留我的所有Mapper.CreateMap
。
public class ViewModelToDomainAutomapperProfile : Profile
{
public override string ProfileName
{
get
{
return "ViewModelToDomain";
}
}
protected override void Configure()
{
CreateMap<TripRegistrationViewModel, TripRegistration>()
.ForMember(x=>x.PingAttempts, y => y.Ignore())
.ForMember(x=>x.PingResponses, y => y.Ignore());
}
}
然后我创建一个配置映射,将我所有的配置文件的引导程序(IInitializer
)。
public class AutoMapperInitializer : IInitializer
{
public void Execute()
{
Mapper.Initialize(x =>
{
x.AddProfile<DomainToViewModelAutomapperProfile>();
x.AddProfile<ViewModelToDomainAutomapperProfile>();
});
}
}
然后在我的Global.asax我得到的IInitializer
和循环所有实例贯穿其中Execute()
。
foreach (var initializer in ObjectFactory.GetAllInstances<IInitializer>())
{
initializer.Execute();
}
这是我的一般策略。
通过请求,这里是最后一步的反射实现。
var iInitializer = typeof(IInitializer);
List<IInitializer> initializers = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => iInitializer.IsAssignableFrom(p) && p.IsClass)
.Select(x => (IInitializer) Activator.CreateInstance(x)).ToList();
foreach (var initializer in initializers)
{
initializer.Execute();
}
我喜欢这个样子。我确实有一个问题。我不知道“ObjectFactory.GetAllInstances”是什么。从谷歌搜索,它似乎是StructureMap的一部分。我从来没有使用过,所以有一个.NET的BCL相当于'ObjectFactory.GetAllInstances'?感谢你的回答。 :) –
如果您不使用ioc容器,请启动。结构图是我主要使用的,但也有其他的。我已经用.net反思的方式更新了我的答案。它非常简单。 –
非常感谢,Nathan! –