Ninject вводит модель asp.net MVC

Я использую Ninject и хочу внедрить свойство моей модели. У меня есть следующая модель

public class TCFormModel
{
    public string Name { get; set; }
    public IPNConBut pConBut { get; set; }
}

Я хочу ввести IPNConBut с моим классом ConBut, который реализует IPNConBut.

public class ConBut : IPNConBut { ... }

Как я могу это сделать?

ПОЗЖЕ ИЗМЕНИТЬ - ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Моя модель используется в связующем, и она терпит неудачу, когда пытается создать экземпляр TCFormModel. Это имеет смысл, но как этого избежать? Я пробовал с двумя конструкторами, один без параметров и один с параметром привязки. Я также пробовал [Inject] для свойства и даже для конструктора, и у меня были те же результаты. Конструктор никогда не используется.

public class TCFormModelBinder : IModelBinder
{
    private const string sessionKey = "TCFM_Model";

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        TCFormModel model = null;
        if (controllerContext.HttpContext.Session != null)
        {
            model = (TCFormModel)controllerContext.HttpContext.Session[sessionKey];
        }

        if (model == null)
        {
            model = new TCFormModel();
            if (controllerContext.HttpContext.Session != null)
            {
                controllerContext.HttpContext.Session[sessionKey] = model;
            }
        }
        return model;
    }
}

Заводской интерфейс:

public interface IPNConButFactory
{
    IPNConBut Create();
}

person tzortzik    schedule 04.03.2014    source источник


Ответы (1)


Вы можете использовать инъекцию конструктора:

public class TCFormModel
{
    public TCFormModle(IPNConBut pConBut) {
        this.pConBut = pConBut;
    }

    public string Name { get; set; }
    public IPNConBut pConBut { get; set; }
}

(что обычно рекомендуется) или внедрение свойства:

public class TCFormModel
{
    public string Name { get; set; }

    [Inject]
    public IPNConBut pConBut { get; set; }
}

См. также: https://github.com/ninject/ninject/wiki/Injection-Patterns< /а>

И вообще вики: https://github.com/ninject/ninject/wiki

Обновлять:

Я рекомендую использовать https://github.com/ninject/ninject.extensions.factory расширение.

Привяжите свой заводской интерфейс следующим образом:

IBindingRoot.Bind<IPNConButFactory>().ToFactory();

Затем в TCFormModelBinder введите IPNConButFactory и используйте его для создания экземпляра. Модель должна нуждаться только в одном конструкторе в случае внедрения конструктора или без (= ctor по умолчанию) в случае внедрения свойства.

Я не знаком с asp.net MVC, поэтому я не уверен, можете ли вы на самом деле что-то ввести в TCFormModelBinder, но я думаю, что да. В любом случае, если вы не можете, вам нужно каким-то образом получить доступ к IKernel и получить оттуда фабрику.

person BatteryBackupUnit    schedule 04.03.2014
comment
Да, но проблема в том, что если я создам новую модель, например new TCFormModel(), ей понадобится параметр, и я не смогу ничего отправить. Что мне делать в этом случае? Это не решает мою проблему. Он скажет, что не знает, что такое параметр IPNConBut. - person tzortzik; 04.03.2014