XNA и Ninject: синтаксис для аргументов зависимости? - PullRequest
3 голосов
/ 06 апреля 2010

У меня есть класс с открытым конструктором:

    public MasterEngine(IInputReader inputReader)
    {
        this.inputReader = inputReader;

        graphicsDeviceManager = new GraphicsDeviceManager(this);
        Components.Add(new GamerServicesComponent(this));
    }

Как я могу внедрить зависимости, такие как graphicsDeviceManager и new GamerServicesComponent, продолжая указывать аргумент this?

Ответы [ 3 ]

3 голосов
/ 06 апреля 2010

Вы должны иметь возможность вводить фабричных делегатов для компонентов вместо фактических компонентов. 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)
{
    ...
}
1 голос
/ 06 апреля 2010

Этот блог предлагает один метод предоставления GameServices, который, в свою очередь, позволяет вводить такие вещи, как GraphicsDeviceManager. Недавно я реализовал проект с использованием подхода, похожего на это, и это сработало.

0 голосов
/ 06 апреля 2010
kernel.Bind<IInputReader>()
                    .To<SomeInputReader>()
                    .OnActivation(instance =>
                                    {
                                        instance.GraphicsDeviceManager = new GraphicsDeviceManager(instance);
                                        Components.Add(new GamerServicesComponent(instance));
                                    });
...