Simple Injector and SolrNet

I am moving from the simple world of Ninject to the fast world of Simple Injector, but I'm stuck with SolrNet. Many popular IoCs already have SolrNet integration, but not SimpleInjector.

I started creating my own integration by converting the Unity stuff found at https://github.com/mausch/SolrNet/tree/master/Unity.SolrNetIntegration

Does anyone know if this has been done before (by someone with better knowledge than me), or anyone can convert below to use a simple injector:

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);
    }

So far, I:

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);            
    }

But injection design lines are obviously not for a simple injector.

thanks

UPDATE I should mention that I used solrNet 0.4.x, so the config will be slightly different. Looking at Stephen's answer, I now:

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>();

but with this I get an error:

MappingValidator type IValidationRule [] "rules", . , IValidationRule [], MappingValidator.

+4
1

Unity , Ninject . , Unity .

Ninject . 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>();
}
+5

Source: https://habr.com/ru/post/1526984/


All Articles