2012-08-07 12 views
5

こんにちは、私はリポジトリパターンが新しくなっています。私が従っているアプローチについてのフィードバックがありたいと思います。共通アイテム用のリポジトリパターン

要件:現在ログインしているユーザーのためのメニューを構築

マイソリューション:

  1. 私は、メニュー項目を取得するために、コントローラによって呼び出されるサービスを、作成しました。

    public interface IApplicationHelperService 
    { 
        List<Menu> GetMenuForRoles(); 
    } 
    
  2. サービス

    public class ApplicationHelperService : IApplicationHelperService 
    { 
        private readonly IMenuRepository _menuRepository; //this fecthes the entire menu from the datastore 
        private readonly ICommonService _commonService; //this is a Service that contained common items eg. UserDetails, ApplicationName etc. 
    
        public ApplicationHelperService(IMenuRepository menuRepository,ICommonService commonService) 
        { 
         this._menuRepository = menuRepository; 
         this._commonService = commonService; 
        } 
    
        public List<Menu> ApplicationMenu 
        { 
         get 
         { 
          return _menuRepository.GetMenu(_commonService.ApplicationName); 
         } 
        } 
    
        List<Menu> IApplicationHelperService.GetMenuForRoles() 
        { 
         return ApplicationMenu.Where(p => p.ParentID == null &&  p.IsInRole(_commonService.CurrentUser.Roles)).OrderBy(p => p.MenuOrder).ToList(); 
        } 
    
    } 
    
  3. の実装次にCommonServiceは(例えばサービスに必要な一般的なアイテムに使用。クラスであるCurrentUser

    public interface ICommonService 
    { 
        IUser CurrentUser { get; } 
        string ApplicationName { get; } 
    } 
    

ICommonServiceを実装します。私は現在のユーザーにコンテキストを使用させます。 ds私のサービス層はHttpContextについて知りませんが、これは将来他のタイプのアプリケーションに使用される可能性があるためです。このように、私は現在のユーザーがすべてのアプリケーションを扱うことができますが、私のサービス層は気にしません。

だから、このアプローチは、このような共通サービスをすべてのサービスに良いアプローチで注入するか、これを行う別の方法です。私が尋ねる理由は、後の段階です。何らかの理由で監査目的のために現在のユーザーの詳細が必要です。

これは誰かにとって理にかなっていると思います。 :-)

答えて

1

同様のアプローチを使用しています。違いは、各サービスにCommonServiceオブジェクトを注入していないことです。

私たちはWCFを使用しており、Usernameなどを保存するためにOperationContextの拡張を記述しています。この拡張で定義されたプロパティには、静的メソッド呼び出しを使用してアクセスできます。これはCommonServiceの実装よりも利点があります。 IOCを採用しているため、各サービスコールでCommonServiceにパラメータを渡す直接の方法はありません。たとえば、WCF呼び出しでユーザー名を送信する場合は、各コンストラクターでCurrentUserの値を設定する必要があります。

WCFを使用する予定があるかどうかわかりません。要点は、CommonServiceに変数を渡す必要がある場合は、各コンストラクタの内部にこの値を設定することになります。変数を渡す予定がない場合は、サービスの基本クラスを作成し、開発者にこの基本クラスを使用させるだけです。

また、各コンストラクタに新しいインスタンスを作成しないために、CommonServiceのライフタイムマネージャをUnityPerResolveLifeTimeManagerとして設定する必要があります。それ以外の場合は、各サービスに異なるインスタンスを持つことでエンゲージメントすることができます。

+0

私はWCFサービスを使用することに疑いがあります。パラメータの渡しについては、私はこれが必要であるとは思わない。これは静的なクラスのアプローチです。私は基本クラスを調べます... – Captain0

+0

答えに言及するのを忘れましたが、サービスクラスで複数のリポジトリを解決する必要がある場合は、トランザクションのすべてのリポジトリの変更を保存するために、UnitOfWorkパターンも使用する必要があります。 – daryal

関連する問題