2

Automapperを使用して、すべてのDateTimeをUTCからローカルタイムに変換しようとしていますが、ITypeConverterにインターフェイスを注入する必要があります。アプリケーションを実行するときにこのエラーが発生します。MissingMethodException:このオブジェクトに対して定義されたパラメータのないコンストラクタはありません。ITypeConverterを使用したAutoMapper Dependency Injection

私はこの問題が依存性注入コードにあると思います!

誰でも手伝ってもらえますか?

UserRepository:

public class UtcToLocalConverter : ITypeConverter<DateTime?, DateTime?> 
{ 
    public UtcToLocalConverter(IBaseSettings baseClass) // I tried to inject here!!! 
    { 
     Settings = baseClass; 
    } 

    private IBaseSettings Settings { get; } 

    public DateTime? Convert(DateTime? source, DateTime? destination, ResolutionContext context) 
    { 
     if (source == null) return null; 

     var tzi = TimeZoneInfo.FindSystemTimeZoneById(Settings.UserData.TimeZone); 
     return TimeZoneInfo.ConvertTime(DateTime.SpecifyKind((DateTime)source, DateTimeKind.Utc), tzi); 
    } 
} 
+0

コードをスクリーンショット画像として投稿しないでください。関連するコードをコピーして質問に貼り付けることはできますか? –

+0

@NateBarbettini提案をありがとう!あなたはこのことについてどう思いますか? – JhobanyPena

答えて

1

public class UserRepository : IUserRepository 
{ 
    private static readonly MapperConfiguration Config = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<User, User>(); 

     cfg.CreateMap<DateTime?, DateTime?>().ConvertUsing<UtcToLocalConverter>(); 
    }); 

    public List<User> GetById(string[] ids) 
    { 
     var result = BuildQuery().Where(w => ids.Contains(w.UserName)).ToList(); 

     var mapper = Config.CreateMapper(); 

     return mapper.Map<List<User>>(result); // Throws error !!! 
    } 

    #region Helper 

    private IQueryable<User> BuildQuery() 
    { 
     return Settings.EpedDb.User; 
    } 

    #endregion 
} 

Converterはあなたの直感は正しいです:あなたはCreateUsing<TTypeConverter>()を使用するときには、コンストラクタに任意のパラメータを注入することはできません。型にはパラメータのないコンストラクタが必要です。

あなたはCreateUsing()に単一のインスタンスを渡すことができます。

var converter = new UtcToLocalConverter(mySettings); 
cfg.CreateMap<DateTime?, DateTime?>().ConvertUsing(converter); 

しかし、私は、実行時にユーザーのタイムゾーンを処理しようとする依存性注入を使用しているので、それが動作しません疑います。

私は本当のあなたの問題の解決策は、アプリケーションのこの層でタイムゾーンを扱わないことだと思います。 .NET DateTimeクラスはタイムゾーンを処理する上で悪く悪いです。

あなたはする必要があります代わりにUTCでDateTime?

  • 必ずストアの日付(オフセット0)
    • 使用DateTimeOffset?は、アプリケーションコード
    • にタイムゾーンの変換を心配しないでくださいレンダリングまたはプレゼンテーションレイヤで、UTCの日付をユーザーのローカルタイムゾーンで表示する

    これは、日付と時間帯をよりきれいに処理する方法です。

  • 0

    @NateBarbettiniが言ったことは意味がありますが、これはConstructServicesUsingを使って行うことができます。ドキュメントはhereです。

    関連する問題