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