我试图将我的会话字典类的依赖注入到我的控制器的构造函数中。例如:
public AccountController(ISessionDictionary sessionDictionary)
{
this.sessionDictionary = sessionDictionary;
}
在我的global.asax文件中:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(ISessionDictionary), new SessionDictionaryBinder());
}
我的SessionDictionaryBinder:
public class SessionDictionaryBinder : IModelBinder
{
private const string sessionKey = "_seshDic";
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.Model != null)
{
throw new InvalidOperationException("Cannot update instances");
}
ISessionDictionary seshDic = (SessionDictionary)controllerContext.HttpContext.Session[sessionKey];
if (seshDic == null)
{
seshDic = new SessionDictionary();
controllerContext.HttpContext.Session[sessionKey] = seshDic;
}
return seshDic;
}
}
当我去/ account / login时,我收到错误:
Error activating ISessionDictionary
No matching bindings are available, and the type is not self-bindable.
Activation path:
2) Injection of dependency ISessionDictionary into parameter sessionDictionary of constructor of type AccountController
1) Request for AccountController
我正在使用Ninject进行DI,我在App_Start目录中包含的文件中的其他绑定工作正常。我假设modelbinder应该进入该文件,但语法是什么?
干杯!
答案 0 :(得分:0)
正如我所看到的,你正在混合一些东西。 在这里,您将模型绑定器注册到MVC3框架:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(ISessionDictionary), new SessionDictionaryBinder());
}
除了这个注册,您可以编写期望ISessionDictionary实例的Controller操作,但这与控制器构造函数无关。 Ninject不知道你的绑定,所以你必须在你正在使用的Ninject模块中包含你的绑定(如果你没有期望ISessionDictionary参数的动作,那么你根本不需要模型绑定器)< / p>