2012-02-14 5 views
0

最初にいくつかの背景。モデルにリクエスト固有の詳細を挿入するには

私は同僚にこのように少し見えるモデルAPIを提供しようとしています。私のAPIの

public class ProductFilterViewModel : ModelBase 
{ 
    [SelectItem ManagerType = typeof(UnitManager) 
       SelectMethod = "GetUnits" 
       TextProperty = "Name" 
       ValueProperty = "Text"] 
    IEnumerable<SelectListItem> UnitSelectItems { get; set; } 

    public IModelContext ModelContext { get; set; } 

    // More properties etc. 
} 


public interface IModelContext 
{ 
    string AccessToken { get; } 
} 

ユーザーが以下のいずれかを(罰金のいずれかで、ファクトリメソッド、またはNInjectコンテナを使用して経由して)新しいインスタンスを作成することができるか、コントローラのパラメータに、このバウンドのインスタンスを持っていると持っている必要があります起こる - [SelectItem]で帰属されるプロパティは移入され、IModelContextのインスタンスが注入されるべきです。

public class SomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // or whatever 
     ProductFilterViewModel model = this.Container.Get<ProductFilterViewModel>(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ProductFilterViewModel model) 
    { 
     model.RunSearch(); // will internally use model.ModelContext.AccessToken; 
     return View(model); 
    } 
} 

さて、AccessTokenプロパティはクッキーから来て、モデル内で発生するすべてのデータベース・アクセスのために不可欠である - 私はこの作業を取得することができます[のSelectItem]

に起因するこれらのプロパティの自動移植を含みますモデルバインディングは完璧です。私が苦労しているところは、コードを複製せずに、拘束力のない場合にこれをどうやって進めるのかです。理想的には、モデルバインダーは同じ工場/コンテナを使用します。私はDependencyResolver.Current経由で設定しようとしましたが、要求時にそのAccessTokenをCookieから挿入するようにコンテナを設定する方法に苦労しました。私が持っていた唯一の他のアイデアは、ControllerBaseクラスにコンテナを設定して、それを私のモデルバインダーのControllerContextからアクセスすることでしたが、それは厄介なようです。

答えて

2

あなたは間違った方向に向いていると思います。ビューモデルは、IoCコンテナを使用して作成しないでください。依存関係のないダムのデータコンテナである必要があります。

代わりに、ビューモデルによって現在提供されている作業に使用するコントローラに注入できるサービスをいくつか用意し、コントローラがそれらをビューモデルに適切に割り当てる必要があります。あなたはこのように様々な醜いものを防ぐことができ、あなたの問題は非常に簡単に解決することができます。

関連する問題