使用Simple Injector注册ISolrAbstractResponseParser<>

时间:2017-01-16 11:31:23

标签: c# dependency-injection simple-injector

我正在尝试更新我的代码以使用最新版本的Simple Injector。

旧代码:

container.RegisterOpenGeneric(
    typeof(ISolrAbstractResponseParser<>), 
    typeof(DefaultResponseParser<>));

新代码,无效:

container.Register(typeof(ISolrAbstractResponseParser<>), new[]
{
    typeof(ISolrAbstractResponseParser<>).Assembly,
    typeof(MultiResponseParser<>).Assembly
}); 

出现此错误:

SimpleInjector.ActivationException was unhandled by user code
  HResult=-2146233088
  Message=The constructor of type SolrOperationsFactory<LemmaDocument> contains the parameter with name 'responseParser' and type ISolrAbstractResponseParser<LemmaDocument> that is not registered. 
  Please ensure ISolrAbstractResponseParser<LemmaDocument> is registered, or change the constructor of SolrOperationsFactory<LemmaDocument>.

  Source=SimpleInjector
  StackTrace:
       at SimpleInjector.Container.ThrowParameterTypeMustBeRegistered(InjectionTargetInfo target)
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.GetInstanceProducerFor(InjectionConsumerInfo consumer)
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.BuildExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.ContainerOptions.BuildParameterExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.Registration.BuildConstructorParameters(Type serviceType, Type implementationType, ConstructorInfo constructor)
       at SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType)
       at SimpleInjector.Registration.BuildTransientExpression[TService,TImplementation]()
       at SimpleInjector.Lifestyles.TransientLifestyle.TransientLifestyleRegistration`2.BuildExpression()
       at SimpleInjector.Registration.BuildExpression(InstanceProducer producer)
       at SimpleInjector.InstanceProducer.BuildExpressionInternal()
       at System.Lazy`1.CreateValue()
       at System.Lazy`1.LazyInitValue()
       at System.Lazy`1.get_Value()
       at SimpleInjector.InstanceProducer.BuildExpression()
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.BuildExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.ContainerOptions.BuildParameterExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.Registration.BuildConstructorParameters(Type serviceType, Type implementationType, ConstructorInfo constructor)
       at SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType)
       at SimpleInjector.Registration.BuildTransientExpression[TService,TImplementation]()
       at SimpleInjector.Lifestyles.TransientLifestyle.TransientLifestyleRegistration`2.BuildExpression()
       at SimpleInjector.Registration.BuildExpression(InstanceProducer producer)
       at SimpleInjector.InstanceProducer.BuildExpressionInternal()
       at System.Lazy`1.CreateValue()
       at System.Lazy`1.LazyInitValue()
       at System.Lazy`1.get_Value()
       at SimpleInjector.InstanceProducer.BuildExpression()
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.BuildExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.ContainerOptions.BuildParameterExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.Registration.BuildConstructorParameters(Type serviceType, Type implementationType, ConstructorInfo constructor)
       at SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType)
       at SimpleInjector.Registration.BuildTransientExpression[TService,TImplementation]()
       at SimpleInjector.Lifestyles.TransientLifestyle.TransientLifestyleRegistration`2.BuildExpression()
       at SimpleInjector.Registration.BuildExpression(InstanceProducer producer)
       at SimpleInjector.InstanceProducer.BuildExpressionInternal()
       at System.Lazy`1.CreateValue()
       at System.Lazy`1.LazyInitValue()
       at System.Lazy`1.get_Value()
       at SimpleInjector.InstanceProducer.BuildExpression()
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.BuildExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.ContainerOptions.BuildParameterExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.Registration.BuildConstructorParameters(Type serviceType, Type implementationType, ConstructorInfo constructor)
       at SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType)
       at SimpleInjector.Registration.BuildTransientExpression[TService,TImplementation]()
       at SimpleInjector.Lifestyles.TransientLifestyle.TransientLifestyleRegistration`2.BuildExpression()
       at SimpleInjector.Registration.BuildExpression(InstanceProducer producer)
       at SimpleInjector.InstanceProducer.BuildExpressionInternal()
       at System.Lazy`1.CreateValue()
       at System.Lazy`1.LazyInitValue()
       at System.Lazy`1.get_Value()
       at SimpleInjector.InstanceProducer.BuildExpression()
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.BuildExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.ContainerOptions.BuildParameterExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.Registration.BuildConstructorParameters(Type serviceType, Type implementationType, ConstructorInfo constructor)
       at SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType)
       at SimpleInjector.Registration.BuildTransientExpression[TService,TImplementation]()
       at SimpleInjector.Lifestyles.TransientLifestyle.TransientLifestyleRegistration`2.BuildExpression()
       at SimpleInjector.Registration.BuildExpression(InstanceProducer producer)
       at SimpleInjector.InstanceProducer.BuildExpressionInternal()
       at System.Lazy`1.CreateValue()
       at System.Lazy`1.LazyInitValue()
       at System.Lazy`1.get_Value()
       at SimpleInjector.InstanceProducer.BuildExpression()
       at SimpleInjector.Advanced.DefaultDependencyInjectionBehavior.BuildExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.ContainerOptions.BuildParameterExpression(InjectionConsumerInfo consumer)
       at SimpleInjector.Registration.BuildConstructorParameters(Type serviceType, Type implementationType, ConstructorInfo constructor)
       at SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType)
       at SimpleInjector.Registration.BuildTransientExpression[TService,TImplementation]()
       at SimpleInjector.Lifestyles.TransientLifestyle.TransientLifestyleRegistration`2.BuildExpression()
       at SimpleInjector.Registration.BuildExpression(InstanceProducer producer)
       at SimpleInjector.InstanceProducer.BuildExpressionInternal()
       at System.Lazy`1.CreateValue()
       at System.Lazy`1.LazyInitValue()
       at System.Lazy`1.get_Value()
       at SimpleInjector.InstanceProducer.BuildInstanceCreator()
       at SimpleInjector.InstanceProducer.BuildAndReplaceInstanceCreatorAndCreateFirstInstance()
       at SimpleInjector.InstanceProducer.GetInstance()
       at SimpleInjector.Container.GetInstanceForRootType[TService]()
       at SimpleInjector.Container.GetInstance[TService]()
       at Goo.FileMonitor.FileMonitor.Start() in C:\projects\Gyldendal.Goo\Source\Goo.FileMonitor\Goo.FileMonitor\FileMonitor.cs:line 23
       at Goo.FileMonitor.Program.<>c.<Main>b__0_3(FileMonitor tc) in C:\projects\Gyldendal.Goo\Source\Goo.FileMonitor\Goo.FileMonitor\Program.cs:line 14
       at Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0`1.<WhenStarted>b__0(T service, HostControl control)
       at Topshelf.Builders.DelegateServiceBuilder`1.DelegateServiceHandle.Start(HostControl hostControl)
       at Topshelf.Hosts.ConsoleRunHost.Run()
  InnerException: 

接口在SolrNet中声明,但在我的代码中使用。

container.RegisterOpenGeneric已从Simple Injector中删除。 Link to documentation

Simple Injector在这个类中失败了:

/// <summary>
    /// An adapter for SolrNet.Impl.SolrMoreLikeThisHandlerQueryResultsParser to work around a limitation in SimpleInjector where
    /// arrays of open generic types cannot be injected.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class SolrMoreLikeThisHandlerQueryResultsParserAdapter<T> : SolrMoreLikeThisHandlerQueryResultsParser<T>
    {
        public SolrMoreLikeThisHandlerQueryResultsParserAdapter(IEnumerable<ISolrAbstractResponseParser<T>> parsers) : base(parsers.ToArray())
        {
        }
    }

Simple Injector和注入开放泛型类型的数组是否仍有问题?

***** 我放弃更新我的项目以使用Simple Injector =&gt; 3.0 ***** 我应该删除这个问题吗?

1 个答案:

答案 0 :(得分:0)

正如您已经说过的,编译器错误说明:

  

此扩展方法已被删除。请使用Container.Register(Type,Type)注册泛型类型。如果此注册充当后备注册(如果缺少明确的注册),请使用Container.RegisterConditional(Type,Type,c =&gt;!c.Handled)。

长话短说,将RegisterOpenGeneric的来电替换为Register,如下一个示例所示:

container.Register(
    typeof(ISolrAbstractResponseParser<>), 
    typeof(DefaultResponseParser<>));
相关问题