【问题标题】:Simple Injector and SolrNet简单的注入器和 SolrNet
【发布时间】:2014-02-14 16:28:38
【问题描述】:

我正在从简单的 Ninject 世界转移到快速的 Simple Injector 世界,但我被 SolrNet 卡住了。许多流行的 IoC 已经集成了 SolrNet,但没有 SimpleInjector。

我已经开始通过转换在 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);            
    }

但是 injectionConstructor 行显然不适用于简单的注入器。

谢谢

更新 我应该提到我使用的是 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>();

但是这样我得到了错误:

MappingValidator 类型的构造函数包含的参数 类型 IValidationRule[] 名称为“rules”,但未注册。 请确保 IValidationRule[] 已在容器中注册,或者 更改 MappingValidator 的构造函数。

【问题讨论】:

    标签: c# solrnet simple-injector


    【解决方案1】:

    Unity 配置看起来过于复杂,Ninject 配置要简单得多。我不确定为什么 Unity 配置如此复杂。

    我获取了 Ninject 配置并转换为 Simple Injector。由于我不熟悉 Solr,因此 Solr 可能依赖于 Simple Injector 配置中的一些额外调整,但我认为这会让您继续前进:

    // using SimpleInjector;
    
    public static void Configure(Container container, string serverURL)
    {
        container.RegisterInstance<IReadOnlyMappingManager>(
            new MemoizingMappingManager(new AttributesMappingManager()));
        container.Register<ISolrDocumentPropertyVisitor, DefaultDocumentVisitor>();
        container.Register<ISolrFieldParser, DefaultFieldParser>();
        container.Register(typeof(ISolrDocumentActivator<>), typeof(SolrDocumentActivator<>));
        container.Register(typeof(ISolrDocumentResponseParser<>), typeof(SolrDocumentResponseParser<>));
        container.Register<ISolrFieldSerializer, DefaultFieldSerializer>();
        container.Register<ISolrQuerySerializer, DefaultQuerySerializer>();
        container.Register<ISolrFacetQuerySerializer, DefaultFacetQuerySerializer>();
    
        container.Collection.Register(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.Collection.Register<IValidationRule>(new[] { 
            typeof(MappedPropertiesIsInSolrSchemaRule), 
            typeof(RequiredFieldsAreMappedRule), 
            typeof(UniqueKeyMatchesMappingRule)
        });
    
        container.RegisterInstance<ISolrConnection>(new SolrConnection(this.serverURL));
        container.Register(typeof(ISolrQueryResultParser<>), typeof(SolrQueryResultParser<>));
        container.Register(typeof(ISolrQueryExecuter<>), typeof(SolrQueryExecuter<>));
        container.Register(typeof(ISolrDocumentSerializer<>), typeof(SolrDocumentSerializer<>));
        container.Register(typeof(ISolrBasicOperations<>), typeof(SolrBasicServer<>));
        container.Register(typeof(ISolrBasicReadOnlyOperations<>), typeof(SolrBasicServer<>));
        container.Register(typeof(ISolrOperations<>), typeof(SolrServer<>));
        container.Register(typeof(ISolrReadOnlyOperations<>), typeof(SolrServer<>));
        container.Register<ISolrSchemaParser, SolrSchemaParser>();
        container.Register<IMappingValidator, MappingValidator>();
    }
    

    【讨论】:

    • 我不得不说 Steven,你回答问题的速度比我合作过的任何开源项目人员都快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多