При выполнении стандартной инъекции без указания имени будет использоваться первая привязка. При указании имени будет использоваться именованная привязка. Это не самое красивое решение, но оно работает.

я есть интерфейс с несколькими различными конкретными реализациями. Я пытаюсь дать Ninject значение по умолчанию для использования и использовать другую реализацию, только если имя совпадает. Например, у меня есть следующие привязки.

Bind<ISomething>().To<DefaultSomething>()
Bind<ISomething>().To<OtherSomething>().Named("55abd8b8-097f-4e1c-8d32-95cc97910604");

То, что я хотел бы, если раздел Named не совпадает, чтобы использовать реализацию DefaultSomething. Когда я передаю явно связанный guid, он работает нормально. Когда я передаю любое другое руководство, я получаю исключение «Нет доступных привязок».

Bind<ISomething>().To<OtherSomething>().Named("55abd8b8-097f-4e1c-8d32-95cc97910604");
Bind<ISomething>().To<DefaultSomething>()

Bind<ISomething>().To<DefaultSomething>()
Bind<ISomething>().To<OtherSomething>().When(ctx => ctx.Service != null && ctx.Service.Name == "55abd8b8-097f-4e1c-8d32-95cc97910604");

Я также попытался использовать .When, чтобы проверить привязку, и я попытался изменить порядок, как показано ниже, однако я никогда не смогу связать, если я не передам Guid с явным именем.

эта статья кажется, указывает на то, что привязки по умолчанию работают, поэтому я должен делать что-то не так. Какие-либо предложения?

Изменить: Вот полный пример, показывающий проблему, которую я пытаюсь решить. Желаемое поведение дляkernel.Get<INumber>("Three").Write() вернуться"Unknown Number"

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ninject;

namespace NinjectTest
{
    interface INumber
    {
        string Write();
    }

    class UnknownNumber : INumber
    {
        public string Write()
        {
            return "Unknown Number";
        }
    }

    class One : INumber
    {
        public string Write()
        {
            return "1 = One";
        }
    }

    class Two : INumber
    {
        public string Write()
        {
            return "2 = Two";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            StandardKernel kernel = new StandardKernel();
            kernel.Bind<INumber>().To<UnknownNumber>();
            kernel.Bind<INumber>().To<One>().Named("One");
            kernel.Bind<INumber>().To<Two>().Named("Two");

            Console.WriteLine(kernel.Get<INumber>("One").Write());
            Console.WriteLine(kernel.Get<INumber>("Two").Write());
            Console.WriteLine(kernel.Get<INumber>("Three").Write());

            Console.ReadLine();
        }
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос