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

C# 将构造函数参数作为Ninject中单个解析的一部分传递给根对象的依赖项,c#,dependency-injection,inversion-of-control,ninject,C#,Dependency Injection,Inversion Of Control,Ninject,我有以下几个类(我知道它们设计得不好;我只想表达Ninject问题) 我不知道如何将构造函数参数传递给我的服务(这是实用程序的依赖项,这是主程序的依赖项):- 我理解这是因为构造函数参数没有到达IService 这是解决依赖关系的正确方法吗。我在一些地方读到,如果您使用kernel.Get()“您没有使用DI”。请参阅。需要传递ConstructorArgumentctor的shouldInherit参数true,才能使案例正常工作 一句警告的话——像这样使用神奇的浮动参数通常不是一个好主意——

我有以下几个类(我知道它们设计得不好;我只想表达Ninject问题)

我不知道如何将构造函数参数传递给我的服务(这是
实用程序的依赖项,这是
主程序的依赖项):-

我理解这是因为构造函数参数没有到达IService

这是解决依赖关系的正确方法吗。我在一些地方读到,如果您使用kernel.Get()“您没有使用DI”。

请参阅。需要传递
ConstructorArgument
ctor的
shouldInherit
参数
true
,才能使案例正常工作

一句警告的话——像这样使用神奇的浮动参数通常不是一个好主意——如果需要传递某些内容,请传递它,不要使用容器技巧(即@Steven在其评论中所说的)来混淆问题

(当然,如果您可以
使用构造函数或参数
绑定
,这会更好,但我想您应该知道这一点。)


也许您缺少一个抽象-也许
服务
应该请求一个
服务配置
,而不是两个您可以轻松向后获取的字符串?

我建议将这些值作为
导出XML
的参数提供。这里的经验法则是:通过构造函数(或属性)传递配置和编译时依赖项,通过方法传递运行时依赖项。如果您
Get
,则不执行DI,关键是您应该有一个组合根,它应该解决一件事(使用或不使用DI容器)有很多海龟从那里游出来(它可能会重复很多次)。跑去买,你就不需要听道听途说了。
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();
    }
}
No matching bindings are available, and the type is not self-bindable.