嵌套 Ninject 绑定 - 依赖注入

Nested Ninject Bindings - Dependency Injection

我有两个 classes(接口名称相似):

OuterService(IInnerService innerService)

InnerService(string configurationKey)

在我的 NinjectMvc3 class 我有一个 IInnerService 接口的绑定:

kernel.Bind<IInnerService>.ToMethod(c => new InnerService("myConfigurationKey")))

现在,我只是在 IOuterService 绑定中复制 InnerService 的构造函数实例:

kernel.Bind<IOuterService>.ToMethod(c => new OuterService(new InnerService("myConfigurationKey")))

有什么方法可以通过使用 IInnerService 接口进行 nested/cascading 注入来避免第二个 InnerService 构造函数?

// I realize this isn't valid, but it may better clarify my intent:
kernel.Bind<IOuterService>.ToMethod(c => new OuterService(IInnerService))

我认为普通的 kernel.Bind<IOuterService>().To<OuterService>() 应该很适合你。

我准备了一个小片段来确定这是否真的是您想要的。这是正确的吗?

using System;
using Ninject;

namespace NinjectTest
{
    class Program
    {
        static void Main(string[] args)
        {
            IKernel kernel = new StandardKernel();

            kernel.Bind<IInnerService>().ToMethod(c=>new InnerService("this is a test config key")); //bind InnerService implementation to be used with provided string
            kernel.Bind<IOuterService>().To<OuterService>(); //bind OuterService implementation to be used, all parameters will be injected to it using previously defined configs

            var outerService = kernel.Get<IOuterService>();

            var result = outerService.CallInner();

            Console.WriteLine(result);
            Console.ReadLine();
        }

        public interface IInnerService
        {
            string GetConfigKey();
        }

        public class InnerService : IInnerService
        {
            private readonly string _configurationKey;

            public InnerService(string configurationKey)
            {
                _configurationKey = configurationKey;
            }

            public string GetConfigKey()
            {
                return _configurationKey;
            }
        }

        public class OuterService : IOuterService
        {
            private readonly IInnerService _innerService;

            public OuterService(IInnerService innerService)
            {
                _innerService = innerService;
            }

            public string CallInner() //purely for testing
            {
                return _innerService.GetConfigKey();
            }
        }   

        public interface IOuterService
        {
            string CallInner();
        }
    }
}