サービス層に接続し、ビジネス層に接続し、データ アクセス層に接続する UI 層で設計された ASP.Net アプリケーションがあります。
レイヤーのクラスには、UserId (int) を受け入れるコンストラクターがあります。これは主にロギングや、「LastUpdateUser および CreateUser」ストレージなどに使用されます。
私は複数のタイム ゾーンで作業しており、User テーブルには TimeZoneId があります。UI レベルでは、これはセッション状態内に保存され、タイムゾーンに基づいて日付を操作できます。
サービス層でメソッド「GetTimezoneByUser」を作成し、それに userId を渡すと、層を下ってデータ アクセス層に行き、タイムゾーン情報を取得できます。
私が抱えている問題は、データ転送オブジェクトに、時間ベースの情報を使用するロジックがあることです。
public class PersonDto
{
public int Id { get; set; }
public string Firstname { get; set; }
public string Surname { get; set; }
public decimal GrossSalary { get; set; }
public string Email { get; set; }
public bool Deleted { get; set; }
public List<PersonNonAvailibilityDto> NonAvailibility { get; set; }
public string FullName
{
get { return string.Format("{0} {1}", Firstname, Surname); }
}
public string AvailableToday
{
get
{
if (NonAvailibility != null)
{
var i = NonAvailibility.FirstOrDefault(t => DateTime.UtcNow.Date <= t.EndDate && DateTime.UtcNow.Date >= t.StartDate);
if (i != null) return i.NonAvailibilityType ;
return "";
}
return "";
}
}
私が必要だと思うのは、パブリックな TimeZoneId を持つすべてのレイヤーにアクセスできるある種のクラスであり、それが null の場合は、データ アクセサー クラスを介してデータベースから取得します。しかし、データ アクセサーでこのプロジェクトを参照する必要があります。
DTO クラスでプロジェクトを参照しても問題ありませんか? それらは軽量であることを意図しています。すべてのレイヤーにアクセスできるタイムゾーンを保存できる別の「状態」はありますか? 最後の最悪のオプションは、ZimeZoneID を UserId と共に渡すことです。これは、すべてのコンストラクターで行っている方法です。しかし、それは悪い考えのようです。