不明白ninject和注射

时间:2012-11-20 12:23:17

标签: c# .net dependency-injection ninject

我有一个类,其中包含我的动作(任何逻辑):

public class socActions 
{
    public void Choose(int elem) 
    {
        switch(elem) ... CalcA(elem) || CalcB(elem) ...
    }
    public void CalcA() 
    {

    }
    public void CalcB() 
    {

    }
    public void CalcC() 
    {

    }
}

所以,在我的程序中,当我获得elem值时,我会使用它:

(new socActions()).Choose(elem_val);

Okey,但在socActions类方法中,我希望与我的存储库建立连接或进行任何其他依赖注入。

  1. 如果我将IRepositoryMy repositoryMy添加到构造函数中,那么我就不能 如上所述创建类,bcz现在需要带有参数的构造函数 IRepositoryMy。
  2. 如果我尝试在野外进行注射,则不起作用 (property = null)。
  3. 如果我尝试用方法注射(CalcA, CalcB)它也不起作用。
  4. 我应该如何完成这项任务(注入类,例如存储库)?不想将我的应用程序中的所有内容标记为静态:(

    WinForms,C#,Ninject 3

    修改

    public class socActions
    {
        [Inject]
        public IGridProcessor _GridProcessor { private get; set; }
    

    所以,在方法中它的null:

    public void UpdateInfo(...)
    {                
        ...
        this._GridProcessor.Refresh();
    }
    

    在其他类中,我将IGridProcessor注入构造函数中的类,一切都很好。 在Program.cs中:

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            var kernel = new StandardKernel(new TwttModule());
            var form = kernel.Get<Main>();
    
            Application.Run(form);
        }
    
        public class TwttModule : NinjectModule
        {
            public override void Load()
            {
                Bind<IGridProcessor>().To<GridProcessor>();
            }
        }
    
       public static class AnyClass 
       {
            public static void Act() 
            {
                ....
                (new socActions()).Choose(elem_val);
            }
       }
    

    我应该如何将IGridProcessor注入socActions?

1 个答案:

答案 0 :(得分:0)

使用构造函数注入时,不直接构造类,而是向ninject请求实例。根据您配置ninject的方式,您将获得一个新实例或一个单例实例等。

来自他们的文档:

Samurai warrior = kernel.Get<Samurai>();