2013-08-13 3 views
1

У меня есть приложение ASP.Net, разработанное с использованием слоя пользовательского интерфейса, подключающегося к уровню обслуживания, подключающегося к бизнес-уровню и вплоть до уровня доступа к данным.Переменная доступна для нескольких проектов

Классы для слоев имеют конструкторы, принимающие UserId (int). Это в основном используется для ведения журнала, и такие вещи, как «LastUpdateUser и CreateUser».

Я работаю по часовым поясам, а в моей таблице User у меня есть TimeZoneId. На уровне пользовательского интерфейса это сохраняется в состоянии сеанса, и я могу манипулировать датами на основе их часового пояса.

Я мог бы создать метод на своем сервисе «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 - способом, который я выполняю для всех моих конструкторов. Но это кажется плохой идеей.

+1

Привет, см. Мой ответ здесь: http://stackoverflow.com/a/7474357/559144, я думаю, у вас должен быть сквозной проект/сборка, на который ссылаются все слои, назовите его ProjectName.Core или Projectname .Foundation, если вы предпочитаете и вставляете туда интерфейсы или легкие классы, необходимые для всех слоев. –

ответ

4

Проблема заключается в том, что вы являетесь классом DTO, содержит бизнес-логику. Переместите код на слой, который работает на соответствующем уровне абстракции и вычислит значение свойства «AvailableToday». Объект DTO должен быть простым объектом данных.

+1

Да, я боялся, что это будет ответ. Моя единственная причина в том, что это произошло потому, что это расчетное поле. И у меня есть «проблема с кодировкой» в том, что когда я создаю PersonDto в своем коде, он создается в нескольких разных местах, и у меня нет одного универсального «Объекта Framework Object Object <-> BusinessDto». Итак, я думаю, ты прав. Создайте правильные переводчики (чтобы код не дублировался), и это решит его. – Craig

+0

Если он рассчитан, то он не должен рассчитываться в DTO. –