使用 Ninject Factory 扩展,您可以自动生成工厂,并让工厂将参数传递给类的构造函数。以下测试通过:
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 : Error activation int 没有匹配的绑定可用,并且类型不是自绑定的。激活路径:
3) 将依赖 int 注入 Bar 类型的构造函数的参数 foo
2) 将依赖 IBar 注入 BarContainer 类型的构造函数的参数 bar
1) 请求 IBarContainer
有没有办法让工厂弄清楚我想在解决“Bar”依赖项时使用传递的“foo”参数?