你不应该真的绑定到System.Windows.Forms.Form
. Ninject 主要用于将接口绑定到具体类型,以便您可以将依赖项作为接口传递并在运行时/测试期间切换具体实现。
但是,如果您只想使用 Ninject 以这种方式创建表单,则只需使用Bind<MyForm>().ToSelf()
then do 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();