我正在尝试更新我的代码以使用最新版本的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 ***** 我应该删除这个问题吗?
答案 0 :(得分:0)
正如您已经说过的,编译器错误说明:
此扩展方法已被删除。请使用Container.Register(Type,Type)注册泛型类型。如果此注册充当后备注册(如果缺少明确的注册),请使用Container.RegisterConditional(Type,Type,c =&gt;!c.Handled)。
长话短说,将RegisterOpenGeneric
的来电替换为Register
,如下一个示例所示:
container.Register(
typeof(ISolrAbstractResponseParser<>),
typeof(DefaultResponseParser<>));