首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回一个基于对象(callcontext)的不同的提供程序(绑定)

返回一个基于对象(callcontext)的不同的提供程序(绑定)
EN

Stack Overflow用户
提问于 2012-06-23 10:18:16
回答 1查看 88关注 0票数 2

我正在尝试返回一个不同的提供程序,这取决于自定义上下文。考虑到以下情况

代码语言:javascript
复制
public interface IProvider
{
    string WhoAreYou();
}

和两个提供程序

代码语言:javascript
复制
namespace ProviderOne
{
    public class Implementation : IProvider
    {
        public string WhoAreYou()
        {
            return "Provider One";
        }
    }
}

namespace ProviderTwo
{
    public class Implementation : IProvider
    {
        public string WhoAreYou()
        {
            return "Provider Two";
        }
    }
}

和一个上下文,如下

代码语言:javascript
复制
public class CallContext
{
    public string SomeValue{ get; set; }
    public int AnotherValue { get; set; }
}

我的绑定如下所示

代码语言:javascript
复制
        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);

到目前为止,我相当确定它是正确的,尽管现在已经很晚了,我也没有想法了。

我的问题是如何获得这些绑定。我试过各种方法

代码语言:javascript
复制
        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“错误,在最坏的情况下,我只得到错误。我确信一定有一些我忽略了的简单的东西,或者只是没有意识到。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-06-23 17:54:23

我发现了这个问题,如果将来有人遇到这个问题,上面的解决方案很好,除非你必须显式重写Equals,才能将Ninject解析为对象。如下所示。

代码语言:javascript
复制
    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;
    }

然后,您可以按建议的方式解决它。

代码语言:javascript
复制
    CallContext context1 = new CallContext()
    {
        SomeValue = "one",
        AnotherValue = 1
    };

    var test1 = kernel.Get<IProvider>(b => b.Get<CallContext>("callcontext").Equals(context1));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11166262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档