簡體   English   中英

使用簡單注入器注冊ISolrAbstractResponseParser <>

[英]Using Simple Injector to register ISolrAbstractResponseParser<>

我正在嘗試更新代碼以使用最新版本的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中刪除。 鏈接到文檔

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 => 3.0 *****我應該刪除此問題嗎?

如前所述,編譯器錯誤說明:

此擴展方法已被刪除。 請使用Container.Register(Type,Type)注冊通用類型。 如果此注冊充當后備注冊(如果缺少顯式注冊),​​請改用Container.RegisterConditional(Type,Type,c =>!c.Handled)。

長話短說,更換調用RegisterOpenGenericRegister如圖所示下面的例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM