【发布时间】:2016-09-13 23:13:37
【问题描述】:
要让 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;
}
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 方法完成后获得由 .NET 构建的真实 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?
【问题讨论】:
-
您还在使用 ASP.NET 5 beta7 或 beta8 吗?我记得
services.AddInstance已重命名为AddSingleton以使其与其他单例注册保持一致 -
我的错,这是在 RC2 的公告中,但那是很久以前的事了,我以为是在 RC1 发布之前。 github.com/aspnet/Announcements/issues/119
-
无论如何我都在使用 RC1。
标签: dependency-injection asp.net-core automapper