Ninject ligação contextual padrão
Tenho uma interface com algumas implementações concretas diferentes. Estou tentando dar ao Ninject um padrão para usar e usar somente a outra implementação se um nome corresponder. Por exemplo, eu tenho as seguintes ligações.
Bind<ISomething>().To<DefaultSomething>()
Bind<ISomething>().To<OtherSomething>().Named("55abd8b8-097f-4e1c-8d32-95cc97910604");
O que eu gostaria é que, se a seção Nome não corresponder, use a implementação DefaultSomething. Quando passo o guia explicitamente vinculado, ele funciona bem. Quando passo em qualquer outro guia, recebo a exceção "Não há ligações correspondentes disponíveis".
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");
Eu também tentei usar .Quando verificar a ligação e tentei reverter a ordem como abaixo, no entanto, nunca consigo vincular a menos que passe no Guid que é explicitamente nomead
Este artig parece indicar que as ligações padrão funcionam, então devo estar fazendo algo errado. Alguma sugestão
Edit: Aqui está um exemplo completo mostrando o problema que estou tentando resolver. O comportamento desejado é parakernel.Get<INumber>("Three").Write()
para retornar"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();
}
}
}