使用Ninject基于对象(callcontext)返回不同的提供程序(绑定)

时间:2012-06-23 02:18:16

标签: c# ninject

我正在尝试返回其他提供程序,具体取决于自定义上下文。鉴于以下

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

但它们不起作用,充其量我得到“无约束”错误,最坏的情况是我得到错误。我敢肯定,我一定会有一些容易忽视的东西,或者只是没有意识到。

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了这个问题,如果将来有人遇到这个问题,上面的解决方案就没问了,除非您必须明确重写Ninject的Equals才能解析为该对象。如下。

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