私はasp.netコアを使用して、ORM、現存する依存性注入、およびAutoMapperとしてエンティティフレームワークでRESTサービスを実装して、データモデルをビューモデルに変換します。 私のデータモデルは次のようになります。AutoMapperプロファイルに設定を注入する
public class Entity{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int EntityId {get;set;}
[StringLength(50)]
public string Name {get;set;}
[StringLength(4000)]
public string EntityMetadata {get;set;}
}
public class EntityMetadata{
public string Property {get;set;}
public int OtherProperty {get;set;}
}
public class EntityViewModel{
public string Name {get;set;}
public EntityMetadata EntityMetadata {get;set;}
}
私は柔軟性のためのDBでJSONフォーマットされた文字列などのメタデータを格納しますが、それは強く型付けされたモデルとしてクライアントに公開することにしたいです。この目的のために、私はAutoMapperプロファイルを作成しました。
public class EntityProfile : Profile{
public EntityProfile(JsonSerializerSettings settings) : {
CreateMap<EntityViewModel,Entity>
.ForMember(e=>e.EntityMetadata, m=>m.ResolveUsing(
c=>JsonConvert.SerializeObject(c.EntityMetadata, settings)))
}
}
私が直面してる問題は、私は、彼らがJsonSerializerSettingsの同じインスタンスを共有するようにAutoMapperとMVCを設定する方法を見つけ出すことができないということです。
public void ConfigureServices(IServiceCollection services){
var mvcBuilder = services.AddMvc();
mvcBuilder.AddJsonOptions(options => {
// options.SerializerSettings has no setter
// and this code is run after ConfigureServices is finished
// so I cannot extract or assign serializerSettings instance here
options.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
// configuring AutoMapper here does not work either
});
var mapperConfiguration = new MapperConfiguration(config =>
{
// how to get this serializerSettings from AddJsonOptions???
config.AddProfile(new EntityProfile(serializerSettings));
});
var mapper = mapperConfiguration.CreateMapper();
services.AddSingleton(typeof(IMapper), mapper);
}
UPDATE:
mvcBuilder.AddJsonOptions(options => ConfigureJsonSettings(options.SerializerSettings));
ConfigureMapper(services, ConfigureJsonSettings(new JsonSerializerSettings()));
私は設定などの設定を複製する必要がありました:
private JsonSerializerSettings ConfigureJsonSettings(JsonSerializerSettings settings)
{
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
settings.MissingMemberHandling = MissingMemberHandling.Error;
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
return settings;
}
そして二回それを呼び出す:私は、コードの重複を避けるために、次のやってしまっている .ContractResolverが同一であることを確認します。だから私はまだ、このソフトの設定を行うより良い方法があるかどうかを知りたいです。
'ConfigureForNodaTime'などのパラメータとして' mvcBuilder.AddJsonOptions'メソッド内の 'serializerSettings'の値を使用します。 –