将构造函数参数传递给根对象的依赖项,作为Ninject中单个解析的一部分

时间:2013-04-22 22:12:38

标签: c# dependency-injection inversion-of-control ninject

我有以下课程(我知道它们没有很好的设计;我只想表达Ninject问题)。

我不知道如何将构造函数参数传递给我的服务(Utility的依赖关系是MainProgram的依赖关系: -

class MainProgram
{
    static IKernel kernel;
    static MainProgram mainProgram; 

    Utility Utility;

    static void Main(string[] args)
    {
        kernel = new StandardKernel(new DIModule());

        var constructorArgument1 = new ConstructorArgument("firstArg", args[0]);
        var constructorArgument2 = new ConstructorArgument("secondArg", args[1]);

        mainProgram = kernel.Get<MainProgram>(new IParameter[] { constructorArgument1, constructorArgument2 });
        mainProgram.Utility.ExportToXML();
    }


    public MainProgram(Utility utility)
    {
        this.utility = utility;
    }
}

public class Utility
{
    private IService service;
    public Utility(IService service)
    {
        this.service = service;
    }

    //methods to work with service
}

public class Service : IService 
{
    private readonly string firstArg;
    private readonly string secondArg;

    public Service(string firstArg, string secondArg)
    {
        this.firstArg = firstArg;
        this.secondArg = secondArg;
    }
}


class DIModule : NinjectModule
{
    public override void Load()
    {
        Bind<IService>().To<Service>();
        Bind<Utility>().ToSelf();
        Bind<MainProgram>().ToSelf();
    }
}

kernel.Get<MainProgram>()失败,并显示以下消息:

  

激活字符串

时出错
No matching bindings are available, and the type is not self-bindable.

我理解这是因为构造函数参数没有进入IService。

这甚至是解决我的依赖关系的正确方法。我在几个地方读过,如果你使用kernel.Get()“你没有使用DI”。

1 个答案:

答案 0 :(得分:2)

"inherited constructor arguments" in this blog post from @Remo GloorshouldInherit ctor的ConstructorArgument参数需要通过true才能让您的案例发挥作用。

提醒一句 - 拥有像这样的神奇浮动论点通常不是一个好主意 - 如果需要通过某些事情,通过它并且不要通过使用容器技巧来混淆问题(即@Steven在他的评论中说的话)

(显然如果你能Bind ...... WithConstructorArgument,那就更好了,但我想你知道的。)

也许你错过了抽象 - 也许Service应该要求ServiceConfiguration而不是两个你可以轻易倒退的字符串?