1

我有一个 ASP.Net 应用程序,其设计的 UI 层连接到服务层、连接到业务层并向下连接到数据访问层。

层的类有构造函数,它接受一个 UserId (int)。这主要用于日志记录,以及诸如“LastUpdateUser 和 CreateUser”存储之类的东西。

我正在跨时区工作,在我的用户表中,我有一个 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,如果它为空,则通过数据访问器类从数据库中获取它。但是我需要在我的数据访问器中引用这个项目。

可以在 DTO 类中引用项目吗?它们应该是轻量级的。是否有另一个“状态”可以存储时区,所有图层都可以访问?最后也是最糟糕的选择是将 ZimeZoneID 与 UserId 一起传递——就像我对所有构造函数所做的那样。但这似乎是个坏主意。

4

1 回答 1

4

问题在于您的 DTO 类包含业务逻辑。将代码移动到在适当抽象级别上运行的层并计算“AvailableToday”属性值。DTO 对象应该是纯数据对象。

于 2013-08-13T23:26:18.733 回答