0

私はDIとIoCにまったく慣れていないので、ご想像のとおり、Unityコンテナーでこのアプリケーションを実行するためにいくつかの壁にぶつかり始めています。問題は、LuceneでDIを使用したいときにStandardAnalyzer、次のエラーが発生することです。

StandardAnalyzerタイプには、長さ2のコンストラクターが複数あります。曖昧さを解消できません。

つまり、私が理解しているのは、Unity Containerが最も多くのパラメーターを持つコンストラクターを探しているということですが、複数あるため、どれがどれかを判断できません。ただし、以下のコードでわかるように、コンストラクターは、(Lucene名前空間からの)バージョンのタイプを持つ1つのパラメーターを持つコンストラクターを使用したいだけです。使ってみましInjectionConstructorたが動かないので、出来ないのではないかと思い始めています。何か助けてください?

private const string Analyzer = "analyzer";
private const string Logging = "logging";
private const string FsDirectory = "fsDirectory"; 
private const string IndexWriter =   "indexWriter";

var analyzer = new StandardAnalyzer(Version.LUCENE_29);
var fsDirectory = FSDirectory.Open(new DirectoryInfo(
    new AppConfig().DatabaseName()));
var indexWriter = new IndexWriter(fsDirectory, analyzer, 
    new IndexWriter.MaxFieldLength(int.MaxValue));

this.RegisterType<StandardAnalyzer>(new InjectionConstructor(
    new ResolvedParameter<Version>(Analyzer)));
//RegisterInstance(typeof(StandardAnalyzer), Analyzer, analyzer, 
//    new ContainerControlledLifetimeManager());
RegisterInstance(typeof(FSDirectory), FsDirectory, fsDirectory, 
    new ContainerControlledLifetimeManager());
RegisterInstance(typeof(IndexWriter), IndexWriter, indexWriter, 
    new ContainerControlledLifetimeManager());

this.RegisterType<IDocumentIndexerWithLucene, DocumentIndexerWithLucene>(
    new ContainerControlledLifetimeManager(),
    new InjectionConstructor(
        new ResolvedParameter(typeof(StandardAnalyzer), Analyzer),
        new ResolvedParameter(typeof(Logging), Logging), 
        new ResolvedParameter(typeof(FSDirectory), FsDirectory),
        new ResolvedParameter(typeof(IndexWriter), IndexWriter)));
4

1 に答える 1

3

静的な依存関係 (外部ライブラリまたは .NET フレームワークにある型) の場合、通常は自動配線 (自動コンストラクター注入) を使用せず、その型を作成するデリゲートを登録する必要があります。自動コンストラクター インジェクションは、コンポジション ルートの作成に役立ちますこれにより、構成ルートを変更せずに型のコンストラクターを変更できるため、保守性が向上します。一方、静的な依存関係はそれほど頻繁には変更されないため、保守性は問題になりません。一方、静的な依存関係は多くの場合、DI フレンドリーではなく、複数のコンストラクターを含めることができるため、自動配線がはるかに困難になります (経験しているように)。さらに悪いことに、静的型でオートワイヤリングが機能している場合でも、その外部の新しいバージョンにアップグレードすると、新しいコンストラクターが導入される可能性があるため、構成ルートが壊れる可能性があります (これは、すべての変更が重大な変更であることを証明しています)。 ) DI コンテナーと互換性がありません。

したがって、解決策は、その型を手動で作成するデリゲートを登録することです。

container.Register<IService>(new InjectionFactory(c => 
    new StandardAnalyzer(Version.LUCENE_29))); 
于 2012-10-12T08:00:47.387 に答える