Asp.net mvc 如何将特定于请求的详细信息注入模型

Asp.net mvc 如何将特定于请求的详细信息注入模型,asp.net-mvc,ninject,Asp.net Mvc,Ninject,首先是一些背景 我试图为我的同事提供一个有点像这样的模型API public class ProductFilterViewModel : ModelBase { [SelectItem ManagerType = typeof(UnitManager) SelectMethod = "GetUnits" TextProperty = "Name" ValueProperty = "Text"

首先是一些背景

我试图为我的同事提供一个有点像这样的模型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; }
}
公共类ProductFilterViewModel:ModelBase
{
[选择项目管理器类型=类型(UnitManager)
SelectMethod=“GetUnits”
TextProperty=“Name”
ValueProperty=“Text”]
IEnumerable UnitSelectItems{get;set;}
公共IModelContext模型上下文{get;set;}
//更多的财产等。
}
公共接口IModelContext
{
字符串AccessToken{get;}
}
my API的用户应该能够创建一个新实例(通过工厂方法,或者使用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);
    }
}
public类SomeController:Controller
{
公共行动结果索引()
{
//或者别的什么
ProductFilterViewModel model=this.Container.Get();
返回视图(模型);
}
[HttpPost]
公共操作结果索引(ProductFilterViewModel模型)
{
model.RunSearch();//将在内部使用model.ModelContext.AccessToken;
返回视图(模型);
}
}
现在,AccessToken属性来自一个cookie,对于模型中发生的任何数据库访问都是必不可少的,包括自动填充带有[SelectItem]属性的那些属性


我可以让它与模型绑定完美结合。我正在努力的是如何在不复制代码的情况下在非绑定的情况下实现这一点。理想情况下,模型绑定器将使用相同的工厂/容器。我曾尝试通过DependencyResolver.Current进行设置,但后来我很难将容器配置为在请求时从cookie中注入AccessToken。我唯一的另一个想法是在ControllerBase类中配置容器,然后从我的模型活页夹中的ControllerContext访问它,但这似乎很讨厌。

我认为您走错了方向。不应使用IoC容器创建视图模型。它们应该是没有任何依赖关系的哑数据容器

相反,提供一些可以注入控制器的服务,这些服务将应用于视图模型当前提供的工作,并且必须由控制器将其正确分配给视图模型。你可以通过这种方式防止各种各样的丑陋的事情,你的问题也可以很容易地解决