2012-06-23 38 views
2

我試圖根據自定義上下文返回不同的提供者。鑑於以下與Ninject基於對象(callcontext)返回不同的提供者(綁定)

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); 

但他們沒有工作,在最好的,我得到了「無約束力」的錯誤,在最壞的情況我剛剛得到的錯誤。我確定一定有一些我很容易忽視的東西,或者只是沒有意識到。

謝謝

回答

0

我發現這個問題,如果有人在未來遭遇了這一點,上述解決方案是好的,但你必須明確的重載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)); 
相關問題