0

Ninject Factory Extensions を使用して、注入されたサービスとカスタム値を持つオブジェクトを作成できるようにしています

それで:

public interface IGameOperationsFactory
  {

    ISpinEvaluator Create(GameArtifact game);
    IReelSpinner CreateSpinner(GameArtifact game);
  }

次にモジュールで:

Bind<IGameOperationsFactory>().ToFactory().InSingletonScope();
Bind<ISpinEvaluator>().To<DefaultSpinEvaluatorImpl>();
Bind<IReelSpinner>().To<DefaultReelSpinnerImpl>();

実際のファクトリはクラスのコンストラクターに注入され、次のように使用されます。

_spinner = _factory.CreateSpinner(_artifact);
_spinEval = _factory.Create(_artifact);

_artifact のタイプは GameArtifact です

次に、各実装のコンストラクタ サービスに加えて、渡されたオブジェクトが注入されます。GameArtifact は最初のコンストラクターで正常に渡され、2 番目のコンストラクターでは「新しい」GameArtifact が渡されます。つまり、null ではなく、フレームワークがちょうど呼び出したかのようにデフォルト値のみを持つものです。

new GameArtifact()

既存のものを渡す代わりに!

2 つのオブジェクトのコンストラクターは非常に似ていますが、動作しないコンストラクターは次のようになります。

[Inject]
public DefaultReelSpinnerImpl(GameArtifact ga, IGameOperationsFactory factory, IRandomService serv)
{
  _rand = serv;
  _ra = ga.Reels;
  _mainReels = factory.Create(_ra);
  _winLine = ga.Config.WinLine;
}

ファクトリとサーブが Ninject によって注入され、ga がファクトリ経由で渡されることが想定されている場所。

私が渡したものではなく、新しい「新鮮な」オブジェクトが渡された理由は誰にも分かりますか??

4

1 に答える 1

0

サンプルを少し書き直しましたが、うまくいくようです。より詳細なコード サンプルを提供していただけますか?

私の実装

Ninject の慣例に合わせて動詞CreateGetに変更しました

public interface IGameOperationsFactory
{
    ISpinEvaluator GetSpinEvaluator(GameArtifact gameArtifact);
    IReelSpinner GetReelSpinner(GameArtifact gameArtifact);
}

Ninject構成

ファクトリを構成するために名前付きバインディングを追加しました

Bind<ISpinEvaluator>()
    .To<DefaultSpinEvaluatorImpl>()
    .Named("SpinEvaluator");

Bind<IReelSpinner>()
    .To<DefaultReelSpinnerImpl>()
    .Named("ReelSpinner");

Bind<IGameOperationsFactory>()
    .ToFactory();

ps:テスト付きの完全なサンプル

于 2013-06-06T15:28:33.863 に答える