public ICallistoCollectionConfigurator ConfigureCollection <TInterface, TConcrete, TDocumentRoot>(string database, string collection, ServiceLifetime lifetime, Func <IServiceProvider, object[]> extraDependencies = null) where TDocumentRoot : class, IDocumentRoot where TConcrete : CallistoCollection <TDocumentRoot>, TInterface { ConfigureCollectionContext <TDocumentRoot>(database, collection, lifetime); _solariBuilder.Services.Add(ServiceDescriptor.Describe(typeof(TInterface), provider => { CallistoLogger.CollectionLogger.Registering(collection, lifetime.ToString()); var context = provider.GetRequiredService <ICallistoCollectionContext <TDocumentRoot> >(); CollectionOperators <TDocumentRoot> operators = CreateCollectionOperators <TInterface, TConcrete, TDocumentRoot>(context.Collection, provider); if (extraDependencies is null) { return(ActivatorUtilities.CreateInstance <TConcrete>(provider, context, operators)); } object[] extra = extraDependencies(provider); return(ActivatorUtilities.CreateInstance <TConcrete>(provider, context, operators, extra)); }, lifetime)); return(this); }
private static CollectionOperators <TDocumentRoot> CreateCollectionOperators <TInterface, TConcrete, TDocumentRoot>( IMongoCollection <TDocumentRoot> mongoCollection, IServiceProvider provider) where TDocumentRoot : class, IDocumentRoot where TConcrete : CallistoCollection <TDocumentRoot>, TInterface { var deleteOperator = new DeleteOperator <TDocumentRoot>(mongoCollection, provider.GetRequiredService <ICallistoDeleteOperationFactory>()); var replaceOperator = new ReplaceOperator <TDocumentRoot>(mongoCollection, provider.GetRequiredService <ICallistoReplaceOperationFactory>()); var queryOperator = new QueryOperator <TDocumentRoot>(mongoCollection, provider.GetRequiredService <ICallistoQueryOperationFactory>()); var updateOperator = new UpdateOperator <TDocumentRoot>(mongoCollection, provider.GetRequiredService <ICallistoUpdateOperationFactory>()); var insertOperator = new InsertOperator <TDocumentRoot>(mongoCollection, provider.GetRequiredService <ICallistoInsertOperationFactory>()); var operators = new CollectionOperators <TDocumentRoot>(deleteOperator, replaceOperator, insertOperator, queryOperator, updateOperator); return(operators); }