безопасный запрошенный дизайн сервисного уровня?

Представьте, что вы используете EntityFramework в качестве ORM, и все это заключено в отдельную библиотеку классов DAL.

У вас есть следующий объект POCO в другой «общей» библиотеке классов, которая хорошо используется вашим DAL, SL и уровнем представления:

public class User
{
   public int Id { get; set;}
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Email { get; set; }
   public int Age { get; set; }
   public Gender Gender { get; set; }
}

Затем вы реализуете в SL следующее:

public interface IUserService
{
   User GetById(int u);
   List<User> GetByLastName(string s);
}

public class UserService : IUserService
{
   private MyContext _myContext;
   public UserService(MyContext myContext = null)
   {
      _myContext = myContext ?? new MyContext();
   }
   public User GetById(int userId)
   {
      return _myContext.Users.FirstOrDefault(u=>u.Id == userId);
   }

   public List<User> GetByLastName(string lastName)
   {
      return _myContext.Users.Where(u=>u.LastName == lastName).ToList();
   }
}

И все работает отлично.
.
Но тогда вам нужно добавить в службу новый метод для обработки другого запроса (например, пользователей, попадающих в возрастной диапазон).
А затем другой.
И еще один...
.
Вскоре вы начинаете думать

Было бы неплохо, если бы вы могли предоставить любой запрос, который вы можете придумать, на уровень службы, и он получил бы соответствующие данные и вернул бы их для вас, без необходимости явно определять каждый возможный запрос как отдельный метод, много в так же, как SL уже делает с DAL?

Итак, вопрос:

Можно ли добиться этого БЕЗОПАСНО в пределах SL, сохраняя при этом слабую связанность? .
Я читал, что использование IQueryable может привести к катастрофе с такими вещами, как:

q.Where(x=>{Console.WriteLine("fail");return true;});

Но я также новичок в использовании ORM и уровней обслуживания, поэтому, естественно, я ищу «лучшие практики» и «известные ловушки», а также хочу, чтобы мой код оставался чистым.


person Sk93    schedule 11.06.2015    source источник
comment
Прочитайте это: cuttingedge.it/blogs/steven/pivot/entry .php?id=95. Это большое изменение, но после его добавления запросы (и команды) становятся невероятно простыми. Вам нужно будет написать код для запроса (чтобы обработать его), но это все.   -  person Maarten    schedule 11.06.2015
comment
Если вы немного перевернете это, вы спросите, разумно ли размещать бизнес-логику о том, как выбирать пользователей определенным образом на уровне представления/интерфейса пользователя. Что бы вы ответили на это?   -  person James Thorpe    schedule 11.06.2015
comment
@JamesThorpe согласен с тем, что бизнес-логика не находится на уровне пользовательского интерфейса, однако, если вы просто выбираете пользователя для целей отображения, считается ли это бизнес-логикой, а не логикой представления?   -  person Sk93    schedule 11.06.2015
comment
Поиск пользователей по возрастному диапазону для меня был бы бизнес-логикой, да. Через два месяца, когда вам понадобится такая же логика где-то еще, вам все равно нужно будет переместить ее на свой бизнес-уровень :)   -  person James Thorpe    schedule 11.06.2015
comment
@JamesThorpe Думаю, это имеет смысл, если подумать :)   -  person Sk93    schedule 11.06.2015


Ответы (1)


Похоже, вы пропускаете логику бизнес-уровня на уровень представления.

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

Фактический поиск/подгонка данных на основе этих значений должен выполняться на уровне обслуживания/бизнес-уровне.

person Community    schedule 21.10.2015