Ninject Form Clarification

时间:2012-10-28 11:37:31

标签: c# visual-studio-2010 ninject

我有ModuleLoader : NinjectModule,这是我绑定所有内容的地方。

首先我使用

Bind<Form>().To<Main>();

System.Windows.Forms.Form绑定到我的Main表单。

这是对的吗?

其次在Program.cs中我用它:

 _mainKernel = new StandardKernel(new ModuleLoader());
 var form = _mainKernel.Get<Main>();

_mainKernel是一个ninject标准内核。

然后我使用Application.Run(form)

这是对的吗?

我不确定在Windows.Forms时要绑定什么。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你不应该真正绑定System.Windows.Forms.Form。 Ninject主要用于将接口绑定到具体类型,以便您可以将依赖项作为接口传递,并在运行时/测试期间切换具体实现。

如果您只是想以这种方式使用Ninject创建表单,那么您只需使用Bind<MyForm>().ToSelf()然后执行kernel.Get<MyForm>()。如果您直接请求具体类型并且它没有任何依赖性,那么使用Ninject初始化它没有多大意义。

在您的情况下,如果您的表单实现了一个接口,那么您将执行:Bind<IMainForm>().To<MainForm>()并从Ninject请求接口类型。通常,您的界面不应该绑定到“表单”的概念,但它应该与实现无关(因此以后您可以生成CLI和网站版本并简单地交换Ninject绑定)。

您可以使用Model-View-Presenter设计模式(或变体)来实现这一目标:

public interface IUserView
{
    string FirstName { get; }
    string LastName { get; }
}

public class UserForm : IUserView, Form
{
    //initialise all your Form controls here

    public string FirstName
    {
        get { return this.txtFirstName.Text; }
    }

    public string LastName
    {
        get { return this.txtLastName.Text; }
    }
}

public class UserController
{
    private readonly IUserView view;

    public UserController(IUserView view)
    {
        this.view = view;
    }

    public void DoSomething()
    {
        Console.WriteLine("{0} {1}", view.FirstName, view.LastName);
    }
}

Bind<IUserView>().To<UserForm>();
Bind<UserController>().ToSelf();

//will inject a UserForm automatically, in the MVP pattern the view would inject itself though    
UserController uc = kernel.Get<UserController>(); 
uc.DoSomething();