1

Ninjectを使用してXmlReaderを注入しようとしています。問題は、コンストラクターではなくファクトリメソッドによって作成されることです。[Inject]また、.NETFrameworkのコードにを追加することはできません。次に、次のバインディングを使用してXmlReaderを作成します。

Bind<IXmlReader>()
    .ToMethod(
        x =>
        XmlReader.Create(
                        (string) GetParameter(x, "inputUri"),
                        (XmlReaderSettings) GetParameter(x, "settings")))
    .Named("definition");            


private object GetParameter(IContext context, string name)
{
    var parameters = (List<IParameter>) context.Parameters;
    return (from p in parameters 
            where p.Name == name 
            select p.GetValue(context))
            .FirstOrDefault();
}

そして私はそれを次のように使用します:

var reader = _kernel.Get<IXmlReader>("definition",
                                     new Parameter("inputUri", FilePath, false),
                                     new Parameter("settings", settings, false)))

しかし、このコードはひどいものです。よりきれいな方法で書き直すことはできますか?

4

1 に答える 1

1

あなたはDIをしていません、あなたはサービスロケーションをしています。

私はあなたの本当の文脈を知りませんが、私はに依存し、Func<string,string,IXmlReader>次のようにバインドを行うと思います:-

Bind<Func<string,string,IXmlReader>>()
    .ToMethod( (inputUri,settings) => XmlReader.Create( inputUri,settings))
    .Named("definition");

次に、コンストラクター引数で挿入されたアイテムを宣言します。

[Named("definition")]Func<string,string,IXmlReader> createReader

面白いのは、[Named]上記は私自身のmakey upey属性であり、バインド時に条件付きの側面を実行する必要があるということです。道場を見てください、それはあなたにそのビットを行う方法を示します。ビルトインがありますNamedAttribute(そして何年も前からありましたが、私が何を考えていたのかわかりません)。

ファクトリの注入のようなものがあなたのケースで役立つ場合、次に見るべきことはNinject.Extensions.Factoryです。これらの種類の工場要件のほとんどをクリーンな方法で処理します。

于 2010-10-22T08:23:36.723 に答える