Вы должны иметь возможность вводить фабричных делегатов для компонентов вместо фактических компонентов. NInject поддерживает связывание делегатов "из коробки" через Bind<>().ToMethod()
.
Приятной особенностью такой конструкции является то, что вы получаете преимущества внедрения конструктора, в то же время позволяя экземпляру (MasterEngine
в этом случае) управлять , когда создаются экземпляры .
Ваш конструктор должен выглядеть примерно так:
public MasterEngine(IInputReader inputReader,
Func<MasterEngine,GraphicsDeviceManager> graphicsDeviceFactory,
Func<MasterEngine,GamerServicesComponent> gamerServicesFactory)
{
this.inputReader = inputReader;
graphicsDeviceManager = graphicsDeviceFactory(this);
Components.Add(gamerServicesFactory(this));
}
Вот как вы связываете фабричных делегатов, что более аккуратно:
Bind<Func<MasterEngine, GraphicsDeviceManager>>()
.ToMethod(context => engine => new GraphicsDeviceManager(engine));
Bind<Func<MasterEngine, GamerServicesComponent>>()
.ToMethod(context => engine => new GamerServicesComponent(engine));
Это также можно сделать с типами делегатов:
public delegate GraphicsDeviceManager GdmFactory(MasterEngine engine);
public delegate GamerServicesComponent GscFactory(MasterEngine engine);
...
Bind<GdmFactory>()
.ToMethod(context => engine => new GraphicsDeviceManager(engine));
Bind<GscFactory>()
.ToMethod(context => engine => new GamerServicesComponent(engine));
...
public MasterEngine(IInputReader inputReader,
GdmFactory graphicsDeviceFactory,
GscFactory gamerServicesFactory)
{
...
}