У меня есть интерфейс с несколькими различными конкретными реализациями. Я пытаюсь дать 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");
Я также пытался использовать. Если проверить привязку, и я попытался изменить порядок, как показано ниже, я никогда не смогу связать, если не передать в 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();
}
}
}