Используя расширение Ninject Factory, вы можете автоматически генерировать фабрики и позволить фабрике передавать параметры конструктору класса. Следующий тест проходит:Получите расширение фабрики ninject, чтобы разрешить параметры фабрики для зависимостей.
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>());
}
Однако в моей конкретной проблеме, я хотел бы, чтобы передать заводские аргументы в зависимости от класса я конструирование, а не сам класс, как это:
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>());
}
Этот тест завершается с сообщением:
Ninject.ActivationException: Ошибка активации INT нет соответствующих переплетов доступны, и тип не является само-Привязываемое. Активация путь:
3) Инъекция междунар зависимостей в параметр обув конструктора типа Bar
2) Инъекция зависимостей IBar в параметр строку конструктора типа BarContainer
1) Заявка на IBarContainer
ли есть способ сделать фабрику выяснить, что я хочу использовать переданный аргумент «foo» при разрешении зависимости «Bar»?
Благодарим вас за эту информацию! Это должен быть принятый ответ, поскольку он использует встроенные функции. – McLovin