РЕДАКТИРОВАТЬ: переформулировать и упростить вопрос для уточнения...
В моем сервисном слое у меня есть что-то вроде
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 (внедрять) в уровень обслуживания моего домена, поэтому, когда мои подписи могут быть
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);
}
}