首先是一些背景。
我正在尝试为我的同事提供一个模型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; }
}
我的API的用户应该能够创建一个新实例(通过Factory方法,或使用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属性来自cookie,对于模型中发生的任何数据库访问都是必不可少的 - 包括[SelectItem]归属的那些属性的自动填充
我可以完美地使用模型绑定。我正在努力的是如何在没有重复代码的情况下在非绑定情况下实现这一目标。理想情况下,模型绑定器将使用相同的工厂/容器。我已经尝试通过DependencyResolver.Current进行设置,但后来我在如何配置容器以在请求时从cookie中注入该AccessToken时遇到了困难。我唯一的另一个想法是在ControllerBase类中配置容器,然后从我的模型绑定器中的ControllerContext访问它,但这看起来很蹩脚。
答案 0 :(得分:2)
我认为你正朝着错误的方向前进。不应使用IoC容器创建视图模型。它们应该是没有任何依赖性的哑数据容器。
而是提供一些可以注入到控制器的服务,这些服务将用于视图模型当前提供的工作,并且必须将控制器正确地分配给视图模型。你可以用这种方式防止各种丑陋的事情,你的问题很容易解决。