变量可用于多个项目

时间:2013-08-13 23:20:55

标签: c# asp.net

我有一个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,如果它是null,则通过数据访问器类从数据库中获取它。但是我需要在我的数据访问器中引用这个项目。

在DTO课程中引用项目是否可以?他们的意思是轻量级。还有另一个“状态”我可以存储时区,可以访问所有层吗?最后也是最糟糕的选择是使用UserId传递ZimeZoneID - 就像我对所有构造函数一样。但这似乎是一个坏主意。

1 个答案:

答案 0 :(得分:4)

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