[英]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)。
長話短說,更換調用RegisterOpenGeneric
與Register
如圖所示下面的例子:
container.Register(
typeof(ISolrAbstractResponseParser<>),
typeof(DefaultResponseParser<>));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.