我不會對問題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! –