2

カスタム コンテキストに応じて、別のプロバイダーを返そうとしています。以下を考えると

public interface IProvider
{
    string WhoAreYou();
}

そして2つのプロバイダー

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

しかし、それらは機能しません。せいぜい「バインドなし」エラーが発生し、最悪の場合、エラーが発生するだけです。私が見落としている簡単な何かがあるに違いない、または単に気づいていない.

ありがとうございました

4

1 に答える 1

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));
于 2012-06-23T09:54:23.480 に答える