0

私はインターフェースを持っています:

public interface IInterface
{
string Get(obj o);
}

そして私は2つのクラスを持っています:

public class C1 : IInterface
{
string Get(obj o);
}

public class C2 : IInterface
{
string Get(obj o);
}

o を送信してから、o のプロパティに基づいてどのインターフェイスであるかを Ninject に判断させたいと思います。Obj は次のようなものです。

public class obj
{
    public string Name {get;set;}
    public int Id {get;set;}
}

次のようなものが欲しいです:

Bind<IInterface>().To<C1>.When(obj.Name == "C1");
Bind<IInterface>().To<C2>.When(obj.Name == "C2");

しかし、私は以前に Ninject を使用したことがありません。何か案は?

4

1 に答える 1

1

あなたがいくつかの「思考ステップ」と必要な情報をスキップしたと思うので、私はあなたの質問の解釈にやや寛大でした.

ただし、私が推奨するのは、次のようにすることです。

public interface INamed
{
    string Name { get; }
}

public interface IFactory
{
    IInterface Create(INamed obj);
}

public class Factory : IFactory
{
    private readonly IResolutionRoot resolutionRoot;

    public Factory(IResolutionRoot resolutionRoot)
    {
        this.resolutionRoot = resolutionRoot;
    }

    public IInterface Create(INamed obj) 
    {
        return this.resolutionRoot.Get<IInterface>(obj.Name);
    }
}

別の方法: ninject factory 拡張機能を使用することもできます。残念ながら、デフォルトでは名前付きバインディングをサポートしていませんが、ここに記載されているようにカスタマイズできます。

ただし、率直に言って、ファクトリを手動で実装するほうが理解しやすいため、ファクトリを手動で実装することをお勧めします。私が行ったファクトリをカスタマイズする場合は、.ToFactory()パラメーターを解釈する方法を各バインディングを構成する代わりに、属性 (ファクトリー メソッド パラメーターの処理方法を指定する) のサポートを追加することを検討します。

于 2014-09-16T16:34:37.373 に答える