要するに、ユーザーの種類を取得して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のインスタンスを取得していますか?
@rmac:サービスロケータのパターンはうまくいくようですが、AOPのアプローチは良いかもしれません...私は少し修正するために、私のポストのタイトルを変更しています、ごめんなさい! – Haroon
MVCバージョン2の制約も削除しましたか? MVC 3はインジェクションの方がはるかに優れています。私は、リクエストごとに新しいモデルのバインダーインスタンスを解決する方法があると思います。それが最適な解決策になります。 – rmac
私はあなたがAOPで何をしたいかを描くのに苦労しています。私はそこに少し詳しく説明する必要があります。 – rmac