編集:簡潔にするために言い直され、単純化された質問...
私のサービス層には次のようなものがあります
GetAllMessages(string userid);
システムには、クライアント/サプライヤーなど、さまざまなタイプのユーザーがいる可能性があります...
このサービスはすべてのタイプのユーザーのみが利用できますが、選択したユーザーのみが利用できるサービスを実装する最善の方法は何ですか?
DeleteAllMessages(string userid); //client only
NewSupplierMessages(string userid); //supplier
通常、これらのメソッドはMessagesServiceという 1 つのクラスにあります。
注:明確にするために、ユーザーはログオンして認証されていますが、メソッドを次のように記述する必要があるかどうか疑問に思っています。
DeleteAllMessages(ClientUser user); //client only
NewSupplierMessages(SupplierUser userid); //supplier
基本的に、すべてのアクションのユーザーの詳細を取得し、より厳密に型指定された方法でメソッドを呼び出します...
編集2:
私のドメイン層は私の Web アプリとは別のクラス ライブラリにあることに注意してください。「クライアント ユーザー」は「クライアント」の一部になり、同様に「サプライヤー ユーザー」は「サプライヤー」の一部になります。サービスレイヤーを呼び出して正しいコードを呼び出します (つまり、正しい詳細を取得します) - ユーザー ID またはユーザーの厳密に型指定されたクラスを渡す必要があります。サービスにアクセスできるユーザーを表す DTO オブジェクトに制約があることを理解できません。間違っていますか?
そうでなければ、次のようなものがあります。
GetClientDetails();
ユーザーはasp.netによって処理されるため、ユーザーがこのアクションにアクセスできることはわかっていますが、複数のクライアントがある場合はどうなるでしょうか? 確かに、クライアントIDの一部を渡す必要があります/ユーザーIDを渡す場合、そこからクライアントIDを取得できます...
むしろ、上記の署名のようなものを見て、ドメイン層が間違っていると思います...
EDIT 3: 私が考えることができる他の唯一の代替手段は、ユーザーが認証するときに、使用をasp.net mvcアプリケーション内のUserSessionというクラスにグローバル状態として保存し、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);
}
}