注入 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:

  1. 创建一个新的 class 扩展 AutoMapper.Profile,使用一个覆盖的 Configure,在 Configure 中创建所有地图。
public class YourProfile : Profile
{
   protected override void Configure(){
       //CreateMap<T, TDto>().ForMember....   
   }
}
  1. 在 startup.cs 中,像这样设置 DI:
 public void ConfigureServices(IServiceCollection services)
 {
  //...
   var config = new MapperConfiguration(cfg =>
   {
     cfg.AddProfile(new YourProfile());
   });
   services.AddSingleton<IMapper>(sp => config.CreateMapper())
  //...
 }
  1. 现在注入:
public class Repository{
    private readonly IMapper _mapper;
    public Repository(IMapper mapper){
        _mapper = mapper;
    }
    public List<TDto> ToDtoList<TDto>(){
     return _mapper.Map<List<TDto>>(sourceList);
    }
 }

来源: https://pintoservice.wordpress.com/2016/01/31/dependency-injection-for-automapper-4-2-in-asp-net-vnext-mvc-project/

我认为 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 等等,但它似乎有效:-)