「Ambient Context」と呼ばれるDIパターンがあります。これを使用してこれを行うことができます。
これは、クロスカッティングの問題を常に回避することができますが、ユニットテストのことも可能です。
public abstract class TimeProvider {
private static TimeProvider current =
DefaultTimeProvider.Instance;
public static TimeProvider Current {
get { return TimeProvider.current; }
set {
if (value == null) {
throw new ArgumentNullException("value");
}
TimeProvider.current = value;
}
}
public abstract DateTime UtcNow { get; }
public static void ResetToDefault() {
TimeProvider.current = DefaultTimeProvider.Instance;
}
}
実装は次のようになります:
public class DefaultTimeProvider : TimeProvider {
private readonly static DefaultTimeProvider instance =
new DefaultTimeProvider();
private DefaultTimeProvider() { }
public override DateTime UtcNow {
get { return DateTime.UtcNow; }
}
public static DefaultTimeProvider Instance {
get { return DefaultTimeProvider.instance; }
}
}
コードではなく、直接DateTime
を使用するよりも日時にアクセスするためにTimeProvider.Current
を使用する
標準的な例は、DateTimeのプロバイダです。
デフォルトの具象実装は、通常のDateTime.UtcNowを返します。ただし、単体テストでは、特別なテスト実装を使用して単体テストを実行する前にTimeProvider.Current
を設定することができます。
See this page (where that code comes from) for more information.
だけなので、上の日時、セキュリティ、ロギングととして真に横断的関心事のために、このパターンを使用する必要があります注意してください。
テストプロセス中、ユーザーフィールドを偽のリポジトリに割り当てます。 – Pharaz