嵌套的Ninject绑定-依赖项注入

本文关键字:依赖 注入 绑定 Ninject 嵌套 | 更新日期: 2023-09-27 18:27:24

我有两个类(具有类似名称的接口):

OuterService(IInnerService innerService)
InnerService(string configurationKey)

在我的NinjectMvc3类中,我有一个IInnerService接口的绑定:

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

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

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

有没有什么方法可以通过对IInnerService接口进行嵌套/级联注入来避免第二个InnerService构造函数?

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

嵌套的Ninject绑定-依赖项注入

我认为普通的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();
        }
    }
}