【问题标题】:Ninject implementation in Window Forms - C#Window 窗体中的 Ninject 实现 - C#
【发布时间】:2015-12-08 16:16:28
【问题描述】:

我正在使用带有 Ninject 版本的 Window Forms C#:2.0.0.1

首次安装 Ninject 包:ninject.extensions.infrastructure.winforms

其次,我使用以下代码创建了新类。

public class CustomModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDAL.IORDR>().To<DAL.DAL_ORDR>();
    }
}

我在下面做的窗口表单中的第三个

public partial class SODetails : Form
{
    public IORDR _IORDR { get; set; }

    [Inject]
    public SODetails(IORDR ORDR)
    {
        _IORDR = ORDR;
    }

    public SODetails()
    {
        InitializeComponent();
    }
}

最后在 Program.cs 中,我做了下面的代码

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    var kernel = new StandardKernel(new CustomModule());
    var form = kernel.Get<SODetails>();
    Application.Run(form);
}

虽然我能够成功注入依赖项,但表单没有显示任何控件。我是否以错误的方式执行 Ninject ?

【问题讨论】:

    标签: c# winforms c#-4.0 ninject ninject-2


    【解决方案1】:

    我更改了以下代码

    public partial class SODetails : Form
    {
        public IORDR _IORDR { get; set; }
    
        [Inject]
        public SODetails(IORDR ORDR)
        {
            _IORDR = ORDR;
        }
    
        public SODetails()
        {
            InitializeComponent();
        }
    }
    

    public partial class SODetails : Form
    {
        public IORDR _IORDR { get; set; }
    
        [Inject]
        public SODetails(IORDR ORDR)
        {
            _IORDR = ORDR;
            InitializeComponent();
        }
    
        public SODetails()
        {
    

    初始化组件();

        }
    }
    

    【讨论】:

    • 好吧……你已经从两个构造函数中调用了 InitializeComponent()。不使用构造函数链接的任何具体原因?
    • 依赖注入永远不会让我调用默认构造函数。
    • 当然......如果你直接调用默认构造函数,你将永远没有机会注入依赖。
    • 我的观点不是直接从 program.cs 调用默认构造函数,而是使构造函数链接并避免重复。因此程序调用具有依赖关系的构造函数,并且该构造函数调用默认构造函数 - 'SODetails(IORDR ORDR) : this()'。这将防止您在两个构造函数中重复 InitializeComponent() 的函数调用
    • 它对您在此处粘贴的示例代码有效。无论如何,任何对你有用的东西
    【解决方案2】:

    我看到了问题。

    所以您的 SODetails 表单已启动并正在运行,但它没有显示您在设计器中添加的任何控件。我说的对吗?

    问题是 InitializeComponent() 未被调用。

    请修改代码,调用默认构造函数,一切正常。 我对您的构造函数链接 public SODetails(IORDR ORDR) 的代码进行了小改动:this() {....}

    public IORDR _IORDR { get; set; }
    
        [Inject]
        public SODetails(IORDR ORDR) : this()
        {
            _IORDR = ORDR;
        }
    
        public SODetails()
        {
            InitializeComponent();
        }
    
    
        public IORDR _IORDR { get; set; }
    
        [Inject]
        public SODetails(IORDR ORDR) : this()
        {
            _IORDR = ORDR;
        }
    
        public SODetails()
        {
            InitializeComponent();
        }
    

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多