(N)在System.Web.MVC.Controller构造函数中注入会话相关的类(不是Action)

时间:2013-10-23 16:27:50

标签: ninject ninject.web.mvc

之前我将我的类注入到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构造函数中而不是与会话相关的类。

1 个答案:

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

或者说我没弄错你