2017-01-16 45 views
0

我想更新我的代碼以使用最新版本的簡單噴油器。使用簡單的噴油器註冊ISolrAbstractResponseParser <>

舊代碼:

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

簡單的噴油器在這個類中沒有按規定:

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

+0

你能後的在使用'container.RegisterOpenGeneric'代碼時從C#中獲得的精確編譯錯誤? – Steven

+0

我沒有收到使用container.RegisterOpenGeneric的錯誤。我的舊代碼正在運行,但container.RegisterOpenGeneric已在新版本的Simple Injector中被刪除 –

+0

您現在使用哪個版本? – Steven

回答

0

正如你已經指出,編譯器錯誤,指出:

This extension method has been removed. Please use Container.Register(Type, Type) to register a generic 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.

長話短說,與Register更換呼叫RegisterOpenGeneric如在下面的例子:

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

這是我第一次做的,但是我收到了錯誤,你可以在堆棧跟蹤中看到 –

+0

因爲你沒有切換到'註冊(類型,類型)'作爲錯誤解釋,但是'註冊(類型,IEnumerable )'。前者將一個開放的泛型抽象映射到一個開放的泛型實現,而後者批量註冊在提供的程序集中發現的所有非泛型實現,這些實現實現了提供的抽象的一個封閉泛型版本(在您的情況下可能是* none * )。 – Steven

+0

我從Register(type,type)開始,然後嘗試了API中的許多其他功能。 –

相關問題