简体   繁体   English

使用简单注入器注册ISolrAbstractResponseParser <>

[英]Using Simple Injector to register ISolrAbstractResponseParser<>

I am trying to update my code to use the latest version of Simple Injector. 我正在尝试更新代码以使用最新版本的Simple Injector。

Old code: 旧代码:

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

New code, not working: 新代码,不起作用:

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

Getting this error: 收到此错误:

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: 

The interface is declared in SolrNet but used in my code. 该接口在SolrNet中声明,但在我的代码中使用。

container.RegisterOpenGeneric has been removed from Simple Injector. container.RegisterOpenGeneric已从Simple Injector中删除。 Link to documentation 链接到文档

Simple Injector is failing on in this class: 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())
        {
        }
    }

Is there still a problem with Simple Injector and injecting arrays of open generic types? Simple Injector和注入开放泛型类型的数组仍然存在问题吗?

***** I am giving up on updating my project to use Simple Injector => 3.0 ***** Should I delete this question? ***** 我放弃了更新项目以使用Simple Injector => 3.0 *****我应该删除此问题吗?

As you already stated, the compiler error is stating: 如前所述,编译器错误说明:

This extension method has been removed. 此扩展方法已被删除。 Please use Container.Register(Type, Type) to register a generic type. 请使用Container.Register(Type,Type)注册通用类型。 In case this registration acts as fallback registration (in case an explicit registration is missing), please use Container.RegisterConditional(Type, Type, c => !c.Handled) instead. 如果此注册充当后备注册(如果缺少显式注册),​​请改用Container.RegisterConditional(Type,Type,c =>!c.Handled)。

Long story short, replace the call to RegisterOpenGeneric with Register as shown in the next example: 长话短说,更换调用RegisterOpenGenericRegister如图所示下面的例子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM