Привязка пользовательской модели Ninject / MVC3 - Ошибка активации - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь внедрить зависимость в мой класс сессионного словаря в конструктор моего контроллера.Например:

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, работают нормально.Я предполагаю, что связыватель модели должен войти в этот файл, но каков синтаксис?

Приветствия!

1 Ответ

0 голосов
/ 27 марта 2012

Как я понимаю, вы все немного перемешиваете. Здесь вы регистрируете привязку вашей модели к MVC3 Framework:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    ModelBinders.Binders.Add(typeof(ISessionDictionary), new SessionDictionaryBinder());
}

После этой регистрации вы можете написать действия контроллера, ожидающие экземпляр ISessionDictionary, но это не имеет никакого отношения к конструкторам контроллера. Ninject не знает о вашей привязке, поэтому вы должны включить эту привязку в используемый вами модуль Ninject (и если у вас нет действий, ожидающих параметр ISessionDictionary, тогда вам вообще не нужен связыватель модели)

...