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 在第一个构造函数中成功传递,在第二个构造函数中传递了一个“新的”GameArtifact,即不是空的,而是只有默认值的,就好像刚刚调用了框架一样

new GameArtifact()

而不是传入已经存在的!

这两个对象的构造函数非常相似,但不起作用的那个看起来像:

[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

我已经稍微改写了你的示例,它似乎工作正常。您能否提供更详细的代码示例?

我的实现

我已将动词Create更改为Get以匹配 Ninject 约定

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

注入配置

我添加了命名绑定来配置工厂

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

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

Bind<IGameOperationsFactory>()
    .ToFactory();

ps:带测试的完整样本

于 2013-06-06T15:28:33.863 回答