我有一个具有几个不同具体实现的接口.我试图给Ninject一个默认使用,如果名称匹配,只使用其他实现.例如,我有以下绑定.
Bind<ISomething>().To<DefaultSomething>()
Bind<ISomething>().To<OtherSomething>().Named("55abd8b8-097f-4e1c-8d32-95cc97910604");
Run Code Online (Sandbox Code Playgroud)
我想要的是,如果命名部分不匹配,使用DefaultSomething实现.当我传入明确绑定的guid时,它工作正常.当我传入任何其他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");
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用.当检查绑定时,我尝试颠倒了下面的顺序但是我永远无法绑定,除非我传入明确命名的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() …Run Code Online (Sandbox Code Playgroud)