1

サービス層に接続し、ビジネス層に接続し、データ アクセス層に接続する 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 と共に渡すことです。これは、すべてのコンストラクターで行っている方法です。しかし、それは悪い考えのようです。

4

1 に答える 1