РЕДАКТИРОВАТЬ: перефразированный и упрощенный вопрос, чтобы быть согласованным ...
В моем слое обслуживания у меня есть что-то вроде
GetAllMessages(string userid);
В моей системе могут быть пользователи разных типов, такие как клиенты / поставщики и т. Д. *
Эта услуга доступна только для всех типов пользователей, однако, каков наилучший способ реализовать службы, доступные только для выбранных пользователей, например,
DeleteAllMessages(string userid); //client only
NewSupplierMessages(string userid); //supplier
Обычно эти методы находятся в одном классе с именем MessagesService
ПРИМЕЧАНИЕ: просто чтобы уточнить, пользователь вошел в систему и прошел аутентификацию, однако мне интересно, должен ли я написать свои методы так:
DeleteAllMessages(ClientUser user); //client only
NewSupplierMessages(SupplierUser userid); //supplier
В основном получают сведения о пользователе для каждого действия и вызывают методы более строго типизированным образом ...
РЕДАКТИРОВАТЬ 2:
Обратите внимание, что мой уровень домена находится в отдельной библиотеке классов от моего веб-приложения, «пользователь клиента» будет частью «клиента», аналогично «пользователь поставщика» будет частью «поставщика» - так что, если я хотел запросить мой сервисный уровень и вызвать правильный код (то есть получить правильные данные) - я ДОЛЖЕН передать идентификатор пользователя или строго типизированный класс пользователя, я не могу понять, как иметь ограничение на объект DTO, представляющий, кто может получить доступ услуга как некорректная / хрупкая?
В противном случае у меня будет что-то вроде этого:
GetClientDetails();
Пользователь обрабатывается asp.net, поэтому мы знаем, что пользователь может получить доступ к этому действию, однако что, если есть несколько клиентов? Конечно, тогда мы должны передать некоторые идентификаторы клиента / если бы я должен был передать идентификатор пользователя, я мог бы получить из него идентификатор клиента ...
Скорее я бы сказал, что мой доменный слой неверен, увидев что-то вроде подписи выше ...
РЕДАКТИРОВАТЬ 3:
Единственная другая альтернатива, о которой я мог бы подумать, - когда пользователь аутентифицируется, сохраните использование в классе с именем UserSession внутри приложения asp.net mvc как глобальное состояние, а затем внедрите его с помощью DI (ninject) в мой уровень обслуживания домена, поэтому когда мои подписи могут быть
GetClientDetails();
Класс обслуживания домена, реализующий этот интерфейс, может быть:
public class ClientService : IClientWorkerService
{
private ISession _session;
private IGenericRepo = _repo;
public ClientService(IUserSession _session, IGenericRepo _repo)
{
this._session = _session;
this._repo = _repo;
}
public ClientDetails GetClientDetails()
{
var loggedonuser = _session.GetUser();
if(!loggedonuser.isClient())
throw new NoAccessException()
return _repo.Single<Client>(x=> x.ClientID == loggedonuser.ClientID);
}
}