2014-02-14 59 views
4

我正在從Ninject的簡單世界轉移到簡單噴油器的快速世界,但我陷入了SolrNet。很多流行的IoC已經有了SolrNet集成,但不是SimpleInjector。簡單的噴油器和SolrNet

我已經開始通過將在 https://github.com/mausch/SolrNet/tree/master/Unity.SolrNetIntegration

找到統一的東西沒有人要麼知道這已經做之前(通過有人比我更好的知識)創造我自己的整合或任何人都可以轉換成以下用簡單的噴油器:

private static void RegisterSolrOperations(SolrCore core, IUnityContainer container, bool isNamed = true) { 
     var ISolrReadOnlyOperations = typeof (ISolrReadOnlyOperations<>).MakeGenericType(core.DocumentType); 
     var ISolrBasicOperations = typeof (ISolrBasicOperations<>).MakeGenericType(core.DocumentType); 
     var ISolrOperations = typeof (ISolrOperations<>).MakeGenericType(core.DocumentType); 
     var SolrServer = typeof (SolrServer<>).MakeGenericType(core.DocumentType); 
     var registrationId = isNamed ? core.Id : null; 
     var injectionConstructor = new InjectionConstructor(
      new ResolvedParameter(ISolrBasicOperations, registrationId), 
      new ResolvedParameter(typeof (IReadOnlyMappingManager)), 
      new ResolvedParameter(typeof (IMappingValidator))); 
     container.RegisterType(ISolrOperations, SolrServer, registrationId, injectionConstructor); 
     container.RegisterType(ISolrReadOnlyOperations, SolrServer, registrationId, injectionConstructor); 
    } 

到目前爲止,我有:

private static void RegisterSolrOperations(SolrCore core, Container container, bool isNamed = true) 
    { 
     var ISolrReadOnlyOperations = typeof(ISolrReadOnlyOperations<>).MakeGenericType(core.DocumentType); 
     var ISolrBasicOperations = typeof(ISolrBasicOperations<>).MakeGenericType(core.DocumentType); 
     var ISolrOperations = typeof(ISolrOperations<>).MakeGenericType(core.DocumentType); 
     var SolrServer = typeof(SolrServer<>).MakeGenericType(core.DocumentType); 
     var registrationId = isNamed ? core.Id : null; 

     var injectionConstructor = new InjectionConstructor(
      new ResolvedParameter(ISolrBasicOperations, registrationId), 
      new ResolvedParameter(typeof(IReadOnlyMappingManager)), 
      new ResolvedParameter(typeof(IMappingValidator))); 

     container.Register(ISolrOperations, SolrServer, registrationId, injectionConstructor); 
     container.Register(ISolrReadOnlyOperations, SolrServer, registrationId, injectionConstructor);    
    } 

但injecti onConstructor行顯然不適合簡單的注入器。

感謝

UPDATE 我應該有,我用solrNet 0.4.x提及這樣的配置會略有不同。 看着史蒂芬的回答後,我現在有:

container.RegisterSingle<IReadOnlyMappingManager>(
       new MemoizingMappingManager(new AttributesMappingManager())); 

container.Register<ISolrDocumentPropertyVisitor, DefaultDocumentVisitor>(); 
container.Register<ISolrFieldParser, DefaultFieldParser>(); 
container.RegisterAllOpenGeneric(typeof(ISolrDocumentActivator<>), typeof(SolrDocumentActivator<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrDocumentResponseParser<>), typeof(SolrDocumentResponseParser<>)); 
container.Register<ISolrFieldSerializer, DefaultFieldSerializer>(); 
container.Register<ISolrQuerySerializer, DefaultQuerySerializer>(); 
container.Register<ISolrFacetQuerySerializer, DefaultFacetQuerySerializer>(); 

container.RegisterAllOpenGeneric(typeof(ISolrAbstractResponseParser<>), typeof(DefaultResponseParser<>)); 
container.Register<ISolrHeaderResponseParser, HeaderResponseParser<string>>(); 
container.Register<ISolrExtractResponseParser, ExtractResponseParser>(); 

container.RegisterAll<IValidationRule>(new[] { 
    typeof(MappedPropertiesIsInSolrSchemaRule), 
    typeof(RequiredFieldsAreMappedRule), 
    typeof(UniqueKeyMatchesMappingRule) 
}); 

container.Register<ISolrConnection>(() => new SolrConnection(url)); 
container.RegisterAllOpenGeneric(typeof(ISolrMoreLikeThisHandlerQueryResultsParser<>), typeof(SolrMoreLikeThisHandlerQueryResultsParser<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrQueryExecuter<>), typeof(SolrQueryExecuter<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrDocumentSerializer<>), typeof(SolrDocumentSerializer<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrBasicOperations<>), typeof(SolrBasicServer<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrBasicReadOnlyOperations<>), typeof(SolrBasicServer<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrOperations<>), typeof(SolrServer<>)); 
container.RegisterAllOpenGeneric(typeof(ISolrReadOnlyOperations<>), typeof(SolrServer<>)); 
container.Register<ISolrSchemaParser, SolrSchemaParser>(); 
container.Register<ISolrDIHStatusParser, SolrDIHStatusParser>(); 
container.Register<IMappingValidator, MappingValidator>(); 

但這個我得到的錯誤:

The constructor of the type MappingValidator contains the parameter of type IValidationRule[] with name 'rules' that is not registered. Please ensure IValidationRule[] is registered in the container, or change the constructor of MappingValidator.

回答

4

團結配置看起來過於複雜,Ninject配置要簡單得多。我不確定爲什麼Unity配置是那麼複雜。

我抓住Ninject配置並翻譯成Simple Injector。由於我不熟悉Solr的,這可能是因爲Solr的依賴於簡單的噴油器配置了一些額外的調整,但我認爲這將讓你去:

// using SimpleInjector; 
// using SimpleInjector.Extensions; 

public static void Configure(Container container, string serverURL) 
{ 
    container.RegisterSingle<IReadOnlyMappingManager>(
     new MemoizingMappingManager(new AttributesMappingManager())); 
    container.Register<ISolrDocumentPropertyVisitor, DefaultDocumentVisitor>(); 
    container.Register<ISolrFieldParser, DefaultFieldParser>(); 
    container.RegisterOpenGeneric(typeof(ISolrDocumentActivator<>), typeof(SolrDocumentActivator<>)); 
    container.RegisterOpenGeneric(typeof(ISolrDocumentResponseParser<>), typeof(SolrDocumentResponseParser<>)); 
    container.Register<ISolrFieldSerializer, DefaultFieldSerializer>(); 
    container.Register<ISolrQuerySerializer, DefaultQuerySerializer>(); 
    container.Register<ISolrFacetQuerySerializer, DefaultFacetQuerySerializer>(); 

    container.RegisterAllOpenGeneric(typeof(ISolrResponseParser<>), new[] { 
     typeof(ResultsResponseParser<>), 
     typeof(HeaderResponseParser<>), 
     typeof(FacetsResponseParser<>), 
     typeof(HighlightingResponseParser<>), 
     typeof(MoreLikeThisResponseParser<>), 
     typeof(SpellCheckResponseParser<>), 
     typeof(StatsResponseParser<>), 
     typeof(CollapseResponseParser<>) 
    }); 

    container.Register<ISolrHeaderResponseParser, HeaderResponseParser<string>>(); 

    container.RegisterAll<IValidationRule>(new[] { 
     typeof(MappedPropertiesIsInSolrSchemaRule), 
     typeof(RequiredFieldsAreMappedRule), 
     typeof(UniqueKeyMatchesMappingRule) 
    }); 

    container.RegisterSingle<ISolrConnection>(new SolrConnection(this.serverURL)); 
    container.RegisterOpenGeneric(typeof(ISolrQueryResultParser<>), typeof(SolrQueryResultParser<>)); 
    container.RegisterOpenGeneric(typeof(ISolrQueryExecuter<>), typeof(SolrQueryExecuter<>)); 
    container.RegisterOpenGeneric(typeof(ISolrDocumentSerializer<>), typeof(SolrDocumentSerializer<>)); 
    container.RegisterOpenGeneric(typeof(ISolrBasicOperations<>), typeof(SolrBasicServer<>)); 
    container.RegisterOpenGeneric(typeof(ISolrBasicReadOnlyOperations<>), typeof(SolrBasicServer<>)); 
    container.RegisterOpenGeneric(typeof(ISolrOperations<>), typeof(SolrServer<>)); 
    container.RegisterOpenGeneric(typeof(ISolrReadOnlyOperations<>), typeof(SolrServer<>)); 
    base.Bind<ISolrSchemaParser>().To<SolrSchemaParser>(); 
    base.Bind<IMappingValidator>().To<MappingValidator>(); 
} 
+2

我不得不說史蒂芬,你回答問題的方式比我曾經使用過的任何開源項目人員都快。 –

相關問題