にバインドするべきではありませんSystem.Windows.Forms.Form
。Ninject は主に、インターフェイスを具体的な型にバインドすることを目的としているため、依存関係をインターフェイスとして渡し、実行時/テスト中に具体的な実装を切り替えることができます。
ただし、Ninject を使用してこの方法でフォームを作成したい場合は、単にBind<MyForm>().ToSelf()
then doを使用しますkernel.Get<MyForm>()
。ただし、具象型を直接要求していて、依存関係がない場合は、Ninject を使用して初期化してもあまり意味がありません。
あなたの状況では、フォームがインターフェイスを実装している場合は、次のことを行います: Bind<IMainForm>().To<MainForm>()
Ninject からインターフェイス タイプを要求します。通常、インターフェイスは「フォーム」の概念にバインドされるべきではありませんが、実装に依存しない必要があります (後で CLI と Web サイトのバージョンを作成し、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();