我正在尝试返回一个不同的提供程序,这取决于自定义上下文。考虑到以下情况
public interface IProvider
{
string WhoAreYou();
}和两个提供程序
namespace ProviderOne
{
public class Implementation : IProvider
{
public string WhoAreYou()
{
return "Provider One";
}
}
}
namespace ProviderTwo
{
public class Implementation : IProvider
{
public string WhoAreYou()
{
return "Provider Two";
}
}
}和一个上下文,如下
public class CallContext
{
public string SomeValue{ get; set; }
public int AnotherValue { get; set; }
}我的绑定如下所示
CallContext context1 = new CallContext()
{
SomeValue = "one",
AnotherValue = 1
};
Bind<IProvider>().To<ProviderOne.Implementation>().WithMetadata("callcontext", context1);
CallContext context2 = new CallContext()
{
SomeValue = "two",
AnotherValue = 2
};
Bind<IProvider>().To<ProviderOne.Implementation>().WithMetadata("callcontext", context2);到目前为止,我相当确定它是正确的,尽管现在已经很晚了,我也没有想法了。
我的问题是如何获得这些绑定。我试过各种方法
var test1 = kernel.Get<IProvider>(b => b.Get<CallContext>("callcontext") == context1);
//var test1 = kernel.Get<IProvider>(m => m.Has("callcontext") && m.Get<CallContext>("callcontext").Equals(context1));
//var test1 = kernel.Get<IProvider>(m => m.Get<CallContext>("callcontext").Equals(context1));
//var test1 = kernel.Get<IProvider>().Equals(context1);但是它们不起作用,在最好的情况下,我得到"No binding“错误,在最坏的情况下,我只得到错误。我确信一定有一些我忽略了的简单的东西,或者只是没有意识到。
谢谢
发布于 2012-06-23 17:54:23
我发现了这个问题,如果将来有人遇到这个问题,上面的解决方案很好,除非你必须显式重写Equals,才能将Ninject解析为对象。如下所示。
public override bool Equals(object obj)
{
if (obj.GetType() == typeof(CallContext))
{
var context = (CallContext)obj;
if (Country != null)
{
if (Country.ToLower() != context.Country.ToLower())
return false;
}
if (Store != context.Store)
return false;
return true;
}
return false;
}然后,您可以按建议的方式解决它。
CallContext context1 = new CallContext()
{
SomeValue = "one",
AnotherValue = 1
};
var test1 = kernel.Get<IProvider>(b => b.Get<CallContext>("callcontext").Equals(context1));https://stackoverflow.com/questions/11166262
复制相似问题