1

在我将我的类注入到控制器的每个动作中之前。使用此 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 将会话相关的类注入到控制器构造函数中。我已经可以将类注入控制器构造函数,但不能注入与会话相关的类。

4

1 回答 1

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();

或者我没有正确理解你

于 2013-10-31T06:16:42.893 回答