注入 AutoMapper 实例
Injecting AutoMapper instance
我有一个 ASP.NET MVC 应用程序,在 bootstrap 期间以这种方式注册了所有映射:
Mapper.CreateMap<AdvicesModel, Advices>();
到目前为止,我们已经以 "old" 静态方式使用了它:
Mapper.Map<Advice>(adviceDto)
到目前为止一切顺利。
AutoMapper 更新到第4 版后,我看到建议使用它来构建实例。
有人能告诉我如何正确地指示 Castle 将 AutoMapper 的实例注入到我的依赖项中,而不是静态地使用它。
我想象的是这样的:
var viewModel = mapper.Map<CartViewModel>(cart);
注入 IMapper 实例。
对于原生 ASP.net 5 DI:
- 创建一个新的 class 扩展 AutoMapper.Profile,使用一个覆盖的 Configure,在 Configure 中创建所有地图。
public class YourProfile : Profile
{
protected override void Configure(){
//CreateMap<T, TDto>().ForMember....
}
}
- 在 startup.cs 中,像这样设置 DI:
public void ConfigureServices(IServiceCollection services)
{
//...
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile(new YourProfile());
});
services.AddSingleton<IMapper>(sp => config.CreateMapper())
//...
}
- 现在注入:
public class Repository{
private readonly IMapper _mapper;
public Repository(IMapper mapper){
_mapper = mapper;
}
public List<TDto> ToDtoList<TDto>(){
return _mapper.Map<List<TDto>>(sourceList);
}
}
我认为 services.AddSingleton<> 不是 Castle Windsor,所以下面是我的 CastleWindsor 安装程序。
private static void RegisterProfilesAndResolvers(IWindsorContainer container)
{
// register value resolvers
container.Register(Types.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IValueResolver>());
// register profiles
container.Register(Types.FromThisAssembly().BasedOn<Profile>().WithServiceBase().Configure(c => c.Named(c.Implementation.FullName)).LifestyleTransient());
var profiles = container.ResolveAll<Profile>();
var config = new MapperConfiguration(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
});
container.Register(Component.For<MapperConfiguration>()
.UsingFactoryMethod(() => config));
container.Register(
Component.For<IMapper>().UsingFactoryMethod(ctx => ctx.Resolve<MapperConfiguration>().CreateMapper(ctx.Resolve)));
}
我不确定这是否是 ideal/optimal 等等,但它似乎有效:-)
我有一个 ASP.NET MVC 应用程序,在 bootstrap 期间以这种方式注册了所有映射:
Mapper.CreateMap<AdvicesModel, Advices>();
到目前为止,我们已经以 "old" 静态方式使用了它:
Mapper.Map<Advice>(adviceDto)
到目前为止一切顺利。
AutoMapper 更新到第4 版后,我看到建议使用它来构建实例。 有人能告诉我如何正确地指示 Castle 将 AutoMapper 的实例注入到我的依赖项中,而不是静态地使用它。
我想象的是这样的:
var viewModel = mapper.Map<CartViewModel>(cart);
注入 IMapper 实例。
对于原生 ASP.net 5 DI:
- 创建一个新的 class 扩展 AutoMapper.Profile,使用一个覆盖的 Configure,在 Configure 中创建所有地图。
public class YourProfile : Profile { protected override void Configure(){ //CreateMap<T, TDto>().ForMember.... } }
- 在 startup.cs 中,像这样设置 DI:
public void ConfigureServices(IServiceCollection services) { //... var config = new MapperConfiguration(cfg => { cfg.AddProfile(new YourProfile()); }); services.AddSingleton<IMapper>(sp => config.CreateMapper()) //... }
- 现在注入:
public class Repository{ private readonly IMapper _mapper; public Repository(IMapper mapper){ _mapper = mapper; } public List<TDto> ToDtoList<TDto>(){ return _mapper.Map<List<TDto>>(sourceList); } }
我认为 services.AddSingleton<> 不是 Castle Windsor,所以下面是我的 CastleWindsor 安装程序。
private static void RegisterProfilesAndResolvers(IWindsorContainer container)
{
// register value resolvers
container.Register(Types.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IValueResolver>());
// register profiles
container.Register(Types.FromThisAssembly().BasedOn<Profile>().WithServiceBase().Configure(c => c.Named(c.Implementation.FullName)).LifestyleTransient());
var profiles = container.ResolveAll<Profile>();
var config = new MapperConfiguration(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
});
container.Register(Component.For<MapperConfiguration>()
.UsingFactoryMethod(() => config));
container.Register(
Component.For<IMapper>().UsingFactoryMethod(ctx => ctx.Resolve<MapperConfiguration>().CreateMapper(ctx.Resolve)));
}
我不确定这是否是 ideal/optimal 等等,但它似乎有效:-)