【问题标题】:Ninject inject model asp.net MVCNinject 注入模型 asp.net MVC
【发布时间】:2014-03-04 17:31:26
【问题描述】:

我正在使用 Ninject,我想注入我的模型的属性。我有以下模型

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

我想用实现IPNConButConBut 类注入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();
}

【问题讨论】:

    标签: asp.net-mvc model ninject inject


    【解决方案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

    通常是 wiki:https://github.com/ninject/ninject/wiki

    更新:

    我建议使用https://github.com/ninject/ninject.extensions.factory 扩展。

    如下绑定你的工厂接口:

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

    然后,在TCFormModelBinder 中注入IPNConButFactory 并使用它来创建一个实例。在构造函数注入的情况下,模型应该只需要一个构造函数,或者在属性注入的情况下不需要(=default ctor)。

    我对 asp.net MVC 不熟悉,所以我不确定您是否可以实际向TCFormModelBinder 注入一些东西,但我猜是这样。无论如何,如果你不能,你需要以某种方式访问​​IKernel 并从那里检索工厂。

    【讨论】:

    • 是的,但问题是如果我创建一个像new TCFormModel() 这样的新模型,它将需要一个参数,我无法发送任何东西。在这种情况下我该怎么办?这并不能解决我的问题。它会说不知道 IPNConBut 参数是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多