c# - 获取 ninject 工厂扩展以允许将工厂参数传递给依赖项

标签 c# ninject ninject-2 ninject-extensions

使用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 activating int No matching bindings are available, and the type is not self-bindable. Activation path:
3) Injection of dependency int into parameter foo of constructor of type Bar
2) Injection of dependency IBar into parameter bar of constructor of type BarContainer
1) Request for IBarContainer

有没有办法让工厂知道我想在解析“Bar”依赖项时使用传递的“foo”参数?

最佳答案

你好, 默认实例提供者不使用继承的构造函数参数。您可以通过编写自己的实例提供程序来更改此行为,如下所示:

public class CustomInstanceProvider : StandardInstanceProvider {
    protected override ConstructorArgument[] 
        GetConstructorArguments(MethodInfo methodInfo, object[] arguments) 
        {
            var parameters = methodInfo.GetParameters();
            var constructorArguments = 
                new ConstructorArgument[parameters.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                constructorArguments[i] = 
                    new ConstructorArgument
                        (parameters[i].Name, arguments[i], true);
            }
            return constructorArguments;
        }
}

然后你只需要指示 ninject 使用你自己的而不是提供的。

希望对你有帮助

关于c# - 获取 ninject 工厂扩展以允许将工厂参数传递给依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11224606/

相关文章:

c# - 找不到类型或命名空间 'frombody'

asp.net-mvc-3 - MVC3 支架存储库中的 Singleton DbContext 派生对象

ioc-container - Ninject.Mvc 和 Ninject.Wcf 扩展的稳定性

c# - WPF 组合框集合容器显示的文本

c# - 在 Windows 资源管理器中检测文件选择

c# - 如何获取对象是否已在注入(inject)中检索到

c# - 是否可以通过 IContext 解析 Ninject 工厂方法中的调用者实例?

asp.net-mvc - NInject 和 MVC 3 - 我应该使用 DependencyResolver 而不是 [Inject] 属性吗?

c# - 依赖注入(inject) : How to configure interface bindings for wrapping

c# - 你如何让 System.Web.Script.javascriptSerializer 忽略一个属性?