我有一个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 - 就像我对所有构造函数一样。但这似乎是一个坏主意。
答案 0 :(得分:4)
问题在于您的DTO类包含业务逻辑。将代码移动到在适当的抽象级别上运行的层,并计算“AvailableToday”属性值。 DTO对象应该是一个普通的数据对象。