0

私はModuleLoader : NinjectModuleすべてをバインドする場所を持っています。

まず私が使う

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

System.Windows.Forms.FormaをMainフォームにバインドします。

これは正しいです?

次に、Program.cs でこれを使用します。

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

_mainKernelninject 標準カーネルはどこにありますか。

それから私は使用しますApplication.Run(form)

これは正しいです?

に関しては、何を結合するかについてはわかりませんWindows.Forms

助けてくれてありがとう。

4

1 に答える 1

1

にバインドするべきではありません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();
于 2012-11-01T21:29:29.300 に答える