0

私は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が同一であることを確認します。だから私はまだ、このソフトの設定を行うより良い方法があるかどうかを知りたいです。

+0

'ConfigureForNodaTime'などのパラメータとして' mvcBuilder.AddJsonOptions'メソッド内の 'serializerSettings'の値を使用します。 –

答えて

0

JsonSerializerSettingsAddJsonOptionsメソッドの外に宣言し、MapperConfigurationのグローバルコンテキストで使用することができます。

例:重複したコードがありますので

var serializerSettings = new JsonSerializerSettings(); 
serializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); 
serializerSettings.MissingMemberHandling = MissingMemberHandling.Error; 

mvc.AddJsonOptions(options => 
{ 
    // have to repeat this because it's an extension method     
    options.SerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); 
    // can get this from the declared settings 
    options.SerializerSettings.MissingMemberHandling = serializerSettings.MissingMemberHandling; 
}); 

var mapperConfiguration = new MapperConfiguration(config => 
{ 
    // use the already declared settings 
    config.AddProfile(new EntityProfile(serializerSettings)); 
}); 

はそれは素晴らしい解決策ではないのですが、これはとても漂っJsonSerializerSettingsの余分なインスタンスアプリを破るつもりはないされたスタートアップコンフィギュレーションコードです。オプションのプロパティが設定可能な場合は、より簡単になります。

関連する問題