Holen Sie sich die ninject-Factory-Erweiterung, um zu ermöglichen, dass Factory-Parameter an Abhängigkeiten übergeben werden

Mit der Ninject Factory-Erweiterung können Sie automatisch Factorys generieren und die Factory-Parameter an den Konstruktor der Klasse übergeben. Der folgende Test besteht:

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>());
}

In meinem speziellen Problem möchte ich jedoch, dass die Factory-Argumente an eine Abhängigkeit der Klasse übergeben werden, die ich konstruiere, und nicht an die Klasse selbst:

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>());
}

Dieser Test schlägt mit der Meldung fehl:

Ninject.ActivationException: Fehler beim Aktivieren von int Es sind keine übereinstimmenden Bindungen verfügbar, und der Typ kann nicht selbst gebunden werden. Aktivierungspfad:
3) Einspritzen der Abhängigkeit int in den Parameter foo des Konstruktors vom Typ Bar
2) Einfügen der Abhängigkeit IBar in die Parameterleiste des Konstruktors vom Typ BarContainer
1) IBarContainer anfordern

Gibt es eine Möglichkeit, der Factory klar zu machen, dass ich das übergebene Argument 'foo' verwenden möchte, wenn ich die Abhängigkeit 'Bar' auflöse?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage