Dependency injection 使用topshelf.ninject在模块中获取ninject内核

Dependency injection 使用topshelf.ninject在模块中获取ninject内核,dependency-injection,ninject,topshelf,easynetq,Dependency Injection,Ninject,Topshelf,Easynetq,我正在编写一个新的服务,并且第一次使用Topshelf和EasyNetQ。我没有使用MVC或WebAPI(大多数ninject教程/博客文章似乎都假设了这一点)。关键的依赖项是Topshelf、Ninject(mono构建版本而不是nugget包)和EasyNetQ 我之所以选择ninject,是因为我在MVC项目中使用过ninject,以及Topshelf.ninject库的可用性 因此,在设置topshelf时,我调用UseNinject方法并传入Ninject模块: pub

我正在编写一个新的服务,并且第一次使用Topshelf和EasyNetQ。我没有使用MVC或WebAPI(大多数ninject教程/博客文章似乎都假设了这一点)。关键的依赖项是Topshelf、Ninject(mono构建版本而不是nugget包)和EasyNetQ

我之所以选择ninject,是因为我在MVC项目中使用过ninject,以及Topshelf.ninject库的可用性

因此,在设置topshelf时,我调用UseNinject方法并传入Ninject模块:

        public static int Main(string[] args)
    {

        Thread.CurrentThread.Name = "Service Main Thread";


            var exitCode = HostFactory.Run(x =>
            {
                x.UseNinject(new Prototype.Service.Modules.IocModule());

                x.Service<SampleService>(s =>
                {
                    s.ConstructUsingNinject();
                    s.WhenStarted((service, hostControl) => service.Start(hostControl));
                    s.WhenStopped((service, hostControl) => service.Stop(hostControl));
                });
                x.RunAsLocalSystem();
                x.SetDescription("Prototype .NET Micro Service");
                x.SetDisplayName(typeof(SampleService).Namespace);
                x.SetServiceName(typeof(SampleService).Namespace);
                x.UseNLog();
            });
        return (int) exitCode;
        }
    }
我的问题是ninject模块中IExchange和IQueue的绑定。正如您所看到的,工厂方法需要IAdvancedBus的实例,但是内核在运行时为空。我试图通过方法args传入依赖项,因为它是一个静态类,无法通过构造函数进行注入

正确的方法是什么?我似乎找不到对ninject内核的引用,只是感觉不对劲。我觉得我好像掉进了一个兔子洞,因为我试图用错误的方式去做。此外,内核被标记为过时,我看不到获取对象实例的其他方法。显然,我也不能像在MVC中那样使用依赖项解析器

topshelf是否有等效的依赖项解析程序?有更好的模式吗?不过,我要做的是保持松散耦合,所以我希望避免静态类、单例或任何其他迫使我进入难以测试的具体依赖项的情况


有什么想法吗

Ninject.IContext(lambda中的参数)引用了
IKernel
,因此更改为:

Bind<IQueue>().ToMethod(context => QueueFactory.CreatQueue(context.Kernel.Get<IAdvancedBus>())).InSingletonScope();
Bind().ToMethod(context=>QueueFactory.createqueue(context.Kernel.Get()).InSingletonScope();

Ninject.IContext(lambda中的参数)引用了
IKernel
,因此更改为:

Bind<IQueue>().ToMethod(context => QueueFactory.CreatQueue(context.Kernel.Get<IAdvancedBus>())).InSingletonScope();
Bind().ToMethod(context=>QueueFactory.createqueue(context.Kernel.Get()).InSingletonScope();

Ninject.IContext(lambda中的参数)引用了
IKernel
,因此更改为:

Bind<IQueue>().ToMethod(context => QueueFactory.CreatQueue(context.Kernel.Get<IAdvancedBus>())).InSingletonScope();
Bind().ToMethod(context=>QueueFactory.createqueue(context.Kernel.Get()).InSingletonScope();

Ninject.IContext(lambda中的参数)引用了
IKernel
,因此更改为:

Bind<IQueue>().ToMethod(context => QueueFactory.CreatQueue(context.Kernel.Get<IAdvancedBus>())).InSingletonScope();
Bind().ToMethod(context=>QueueFactory.createqueue(context.Kernel.Get()).InSingletonScope();