要让DI框架将依赖项注入到Automapper自定义TypeConverter中,通常使用MapperConfiguration
对象的ConstructServicesUsing
方法。因此,在ASP.NET Core DI中,我期望能够像这样配置AutoMapper:
public static IMapperConfiguration Configure(IServiceProvider provider)
{
var config = new MapperConfiguration(cfg => {
cfg.AddProfile<MyProfile>();
cfg.ConstructServicesUsing(type => provider.GetService(type));
});
config.AssertConfigurationIsValid();
return config;
}
< p > MapperConfiguration
对象将在 startup.cs 中被配置为可注入的服务,如下所示:
public void ConfigureServices(IServiceCollection services)
{
//other service configuration omitted for simplicity
//Automapper config
var provider = services.BuildServiceProvider();
var config = AutoMapperConfig.Configure(provider);
services.AddInstance(config);
}
在这种情况下,依赖项(即Automapper本身)将像这样注入到TypeConverter构造函数中。
public class MyConverter : ITypeConverter<ThisType, ThatType>
{
private IMapper _mapper;
public MyConverter(IMapperConfiguration mapperConfig)
{
var mc = mapperConfig as MapperConfiguration;
_mapper = mc.CreateMapper();
}
public ThatType Convert(ResolutionContext context)
{
//do something with _mapper here
}
}
我已经成功地在几个DI框架中使用了这个模式,但是我无法在ASP.NET Core中让它工作。猜测可能是因为Automapper需要在ConfigureServices方法完成后,给予真正的IServiceProvider实例。然而,即使我把配置的那一部分推迟到Configure方法(如下所示),依赖项仍然不能被注入到TypeConverter中。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider provider)
{
var config = provider.GetService<IMapperConfiguration>();
config.ConstructServicesUsing(type => provider.GetService(type));
}
所以我的问题是:我如何在ASP.NET Core中配置Automapper,以便将依赖项注入自定义TypeConverters中?
services.AddInstance
已经被重命名为AddSingleton
,以使其与其他单例注册保持一致。 - Tseng