0

我对 DI 和 IoC 还很陌生,所以你可以想象我现在开始碰壁,让这个应用程序现在使用 Unity 容器运行。问题是当我想StandardAnalyzer在 Lucene 上使用 DI 时,出现以下错误:

StandardAnalyzer 类型有多个长度为 2 的构造函数。无法消除歧义。

所以我的理解是,Unity Container 正在寻找具有最多参数的构造函数,但因为有多个它无法分辨出哪一个。正如您将在下面的代码中看到的那样,构造函数只是想使用带有一个参数的版本类型(来自 Lucene 命名空间)。我试过使用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 回答