之前我将我的类注入到Controller的每个Action中。使用此ModelBinder方法:
public class AccountViewModelBinder: IModelBinder
{
private const string sessionKey = "Account";
private readonly IViewModelFactory _viewModelFactory;
public AccountViewModelBinder(IViewModelFactory viewModelFactory)
{
_viewModelFactory = viewModelFactory;
}
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// get the Cart from the session
AccountViewModel account = (AccountViewModel)controllerContext.HttpContext.Session[sessionKey];
if (account == null)
{
account = _viewModelFactory.CreateAccountVm();//new Cart();
controllerContext.HttpContext.Session[sessionKey] = account;
}
return account;
}
}
控制器操作:
public ActionResult Index(HomeViewModel homeVm, AccountViewModel accountVm)
{
//do something here...
return View();
}
但是我认为一次又一次地对每一个动作都是一团糟,因为对于一个控制器来说总是一样的。
那么,如何使用ninject将与会话相关的类注入到控制器构造函数中。我已经可以将类注入到conroller构造函数中而不是与会话相关的类。
答案 0 :(得分:1)
你的问题不是那么清楚,无论如何:
您还必须使用ninject重新注入其他所有控制器
也许你可以在BaseController上使用一种方法来处理与泛型的绑定,并在需要时调用它。
protected T BindModel<T>(T model, string sessionKey){
T account = (T)controllerContext.HttpContext.Session[sessionKey];
if (account == null)
{
account = _viewModelFactory.CreateAccountVm();//new Cart();
controllerContext.HttpContext.Session[sessionKey] = account;
}
return account;
}
或者,您可以像下面那样注入它:
Bind<AccountViewModel>().ToProvider<ViewModeProvider>().InRequestScope();
class ViewModeProvider: ViewModeProvider<AccountViewModel> {
protected override AccountViewModel CreateInstance(IContext context) {
//put the logic from above here
return account;
}
}
或
Bind<AccountViewModel>().ToMethod(
c => new AccountViewModel{/* your logic goes here*/}).InRequestScope();
或者说我没弄错你