DIフレームワークがAutomapperカスタムTypeConverterに依存関係を挿入するには、通常、MapperConfiguration
オブジェクトのConstructServicesUsing
メソッドを使用します。だから、ASP.NETコアDIで、私はこのようなAutoMapperを設定できることを期待:ASP.NETコアのAutomapper TypeConverterへの依存関係の注入
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));
}
だから私の質問は:それはカスタムTypeConvertersへの依存性を注入するようにどのように私はASP.NETのコアとAutomapperを設定しますか。
まだASP.NET 5 beta7またはbeta8で作業していますか?私は 'services.AddInstance'を他のシングルトン登録と一直線に保つために' AddSingleton'に名前を変更したことを覚えています – Tseng
私の悪いことは、RC2の発表にありましたが、それはずっと前にRC1のリリース。 https://github.com/aspnet/Announcements/issues/119 – Tseng
いずれにしてもRC1を使用しています。 –