3

私は現在 Ninject と依存性注入を学んでおり、現在のセットアップでは IKernel を場所に渡して、他のクラスが特定のクラスをインスタンス化したり、ファクトリ インスタンスを取得したりできるようにしています。

現在、私はファクトリをシングルトンとしてバインドしており、IKernel をオブジェクトに渡して実行する_kernel.Get<ISomethingFactory>().CreateSomething()と、少しコードの匂いがして、単に Ninject が美化されたサービス ロケータに変わる可能性があるように思えます。

また、ファクトリには IKernel が渡されているため、作成したそれぞれのインターフェイスのバインドされた実装を解決できます。

私の質問は次のとおりです。

  1. ファクトリがこのように機能することは許されますか、それともファクトリは単に具象型自体をインスタンス化する必要がありますか?

  2. IKernel をいたるところに渡す代わりに、コンストラクターを介してファクトリやその他のサービスを渡すことを優先する必要がありますか?

4

1 に答える 1

4

私はしたくない..しかし、それは私だけです。

また、私は自分の工場を展開しません..私は Ninjects Factory 拡張機能を使用しています。ここで見つけることができます:

https://github.com/ninject/ninject.extensions.factory

基本的に、通常のようにバインディングを作成しますが、次にファクトリのインターフェイスを作成します (ここでは WinForms を想定しています)。

public interface IMainFormFactory {
    frmLogin CreateLoginForm();
    frmSettings CreateSettingsForm();
    IRepository<MainFormModel> CreateMainFormRepository();
}

..そして拡張子でバインドしますToFactory

using Ninject.Factories; // can't quite remember namespace at the moment

public class FactoryModule : NinjectModule {
    protected override void Load() {
        Bind<IMainFormFactory>().ToFactory();
    }
}

ファクトリ拡張では、このインターフェイスの具体的な実装を定義する必要はありません..提供したバインディングに基づいて、これらのオブジェクトをどうするかを既に知っています..バックグラウンドで、このインターフェイスを実装するマネージャーを作成します)。

したがって、次のようなことができます。

private readonly IMainFormFactory _factory;

public frmMainForm(IMainFormFactory factory) {
    _factory = factory;
}

public void btnSettings_Click(object sender, EventArgs e) {
    // show the settings form..
    var settingsForm = _factory.CreateSettingsForm();
    settingsForm.ShowDialog();
}

..次に、frmSettings にも注入します。

public frmSettings(ISettingsFormFactory factory) {
    // as above except for ISettingsFactory
}

..これが私が物事を行うことを選択する方法です。他の人がより良いアイデアを持っているかもしれません (私も彼らの意見を聞きたいです!)。

于 2012-12-11T04:42:23.607 に答える