2011-04-11 5 views
0

要するに、ユーザーの種類を取得してIDを取得し、強く型付けされたオブジェクトを取得するためにサービスクラスを使用するカスタムモデルバインダーを作成しようとしています。AOP:Ninjectを使用したカスタムモデルのバインダー属性

これを行うより良い方法がある場合は、教えてください。

Elabaration:

私は私のDomainService層内のすべての私のバインディングとninjectセットアップを持って、3ウェブのUIのは、ドメインサービス層にフックアップされています。各asp.net mvcアプリケーションは、バインディングをkernalにロードします。

//私のカスタムモデルバインダー

public class UserModelBinder : IModelBinder 
    { 
     private IAuthenticationService auth; 

     public UserModelBinder(IAuthenticationService _auth, EntityName type, 
     string loggedonuserid) 
     { 
      this.auth = _auth; 
      CurrentUserType = type; 
      CurrentUserId = loggedonuserid; 
     } 


     public EntityName CurrentUserType { get; private set; } 
     private string CurrentUserId { get; set; } 

     public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
     { 
      object loggedonuser = null; 

      if (CurrentUserType == EntityName.Client) 
       loggedonuser = GetLoggedOnClientUser(CurrentUserId); 
      else if (CurrentUserType == EntityName.Shop) 
       loggedonuser = GetLoggedOnShopUser(CurrentUserId); 
      else 
       throw new NotImplementedException(); 

      return loggedonuser; 
     } 

     public ClientUser GetLoggedOnClientUser(string loggedonuserid) 
     { 
      var user = _auth.GetLoggedOnClientUser(loggedonuserid); 
      if (user == null) 
       throw new NoAccessException(); 

      return user; 
     } 

     public ShopUser GetLoggedOnShopUser(string loggedonuserid) 
     { 
      var user = _auth.GetLoggedOnShopUser(loggedonuserid); 
      if (user == null) 
       throw new NoAccessException(); 

      return user; 
     } 

    } 

私Global.aspx.cs

// using NInject to override application started 
     protected override void OnApplicationStarted() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      // hand over control to NInject to register all controllers 
      RegisterRoutes(RouteTable.Routes); 



//how do I instantiate? 
      ModelBinders.Binders.Add(typeof(object), new 
      UserModelBinder(null,EntityName.Client, User.Identity.Name)); 

     } 

私の問題はIAuthenticationあるサービスであり、それはどのように行う、リポジトリのような他のものに接続されており、私は実際にこれを正しくインスタンス化しますか?新しいNinjectModuleを作成する必要がありますか?私は本当にこれと混同されているので、どんな助けも大歓迎です。私はContainer.Get()で渡そうとしました。 - それはヌルです...

注:モデルバインダーを作成しているのはなぜですか?すべてのコントローラーには、ユーザーのタイプが必要です。私のサービスレイヤーには、どのタイプのユーザーがリクエストしていますか?サービス層は、それがShopUserまたはClientUserまたはシステム内の他のユーザーのために一つのことを行いますオーバーロード...

EDITています: を私は非常にeasiy IAuthenticationService時に私のコントローラのコール内や種類を得ることができます関連するタスクを処理するために私のdomainserviceレイヤーに渡しますが、ModelBindingsを使用してどのように可能であるかを知りたいだけです(そのようにするのが理にかなっている場合)。

Edit2:カスタムアトリビュートをコールするカスタムアトリビュートを使用する実例がありますか?/ binding/ISomethingServiceのインスタンスを取得していますか?

答えて

0

ここでサービスロケータパターンを使用できます。 Ninject Container(IKernel?)をコンストラクタに渡し、何かをバインドする必要があるたびにAuthenticationServiceを解決します。

これを改良すると、サービスを解決する関数を渡すコンストラクタ引数Funcを持つことができます。これはより明示的で、Ninjectへの依存を取り除きます。

+0

@rmac:サービスロケータのパターンはうまくいくようですが、AOPのアプローチは良いかもしれません...私は少し修正するために、私のポストのタイトルを変更しています、ごめんなさい! – Haroon

+0

MVCバージョン2の制約も削除しましたか? MVC 3はインジェクションの方がはるかに優れています。私は、リクエストごとに新しいモデルのバインダーインスタンスを解決する方法があると思います。それが最適な解決策になります。 – rmac

+0

私はあなたがAOPで何をしたいかを描くのに苦労しています。私はそこに少し詳しく説明する必要があります。 – rmac

関連する問題