Uzyskaj ninject rozszerzenie fabryczne, aby umożliwić przekazywanie parametrów fabrycznych do zależności

Używając rozszerzenia Ninject Factory, możesz automatycznie generować fabryki i pozwolić fabryce na przekazywanie parametrów do konstruktora klasy. Następujące testy:

public interface IBar
{
    int Foo { get; }
}

public class Bar : IBar
{
    int _foo;
    public Bar(int foo) { _foo = foo; }
    public int Foo { get { return _foo; } }
}

public interface IBarFactory
{
    IBar CreateTest(int foo);
}

[Test]
public void ExecuteTest()
{
    var kernel = new StandardKernel();
    kernel.Bind<IBar>().To<Bar>();
    kernel.Bind<IBarFactory>().ToFactory();
    var factory = kernel.Get<IBarFactory>();
    var actual = factory.CreateTest(42);
    Assert.That(actual, Is.InstanceOf<Bar>());
}

Jednak w moim szczególnym problemie chciałbym, aby przekazywał argumenty fabryczne zależności klasy, którą konstruuję, a nie samej klasy, jak poniżej:

public interface IBarContainer
{
    IBar Bar { get; }
}

public class BarContainer : IBarContainer
{
    IBar _bar;
    public BarContainer(IBar bar) { _bar = bar; }
    public IBar Bar { get { return _bar; } }
}

public interface ITestContainerFactory
{
    IBarContainer CreateTestContainer(int foo);
}

[Test]
public void ExecuteTestContainer()
{
    var kernel = new StandardKernel();
    kernel.Bind<IBar>().To<Bar>();
    kernel.Bind<IBarContainer>().To<BarContainer>();
    kernel.Bind<ITestContainerFactory>().ToFactory();
    var factory = kernel.Get<ITestContainerFactory>();
    var actual = factory.CreateTestContainer(42);
    Assert.That(actual.Bar, Is.InstanceOf<Bar>());
}

Ten test kończy się niepowodzeniem z komunikatem:

Ninject.ActivationException: Błąd aktywacji int Brak dostępnych powiązań, a typ nie jest samowiążący. Ścieżka aktywacji:
3) Wstrzyknięcie zależności int do parametru foo konstruktora typu Bar
2) Wstrzyknięcie zależności IBar na pasek parametrów konstruktora typu BarContainer
1) Wniosek o IBarContainer

Czy istnieje sposób na sprawienie, aby fabryka zrozumiała, że ​​chcę użyć przekazanego argumentu „foo” podczas rozwiązywania zależności „Bar”?

questionAnswers(3)

yourAnswerToTheQuestion