最初にいくつかの背景。モデルにリクエスト固有の詳細を挿入するには
私は同僚にこのように少し見えるモデル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からアクセスすることでしたが、それは厄介なようです。