如何在gremlin中将DocumentClient转换为IDocumentClient?

时间:2018-11-15 13:25:50

标签: asp.net-core azure-cosmosdb graph-databases gremlin

我正在使用cosmos db来存储和获取数据。以前我像这样使用DocumentClient:

 public class ProductRepository : IProductRepository
    {
        private DocumentClient _documentClient;
        private DocumentCollection _graphCollection;        

        public ProductRepository(DocumentClient documentClient, DocumentCollection graphCollection)
        {
            _documentClient = documentClient;
            _graphCollection = graphCollection;

        }

        public async Task Create(Product product)
        {
            var createQuery = CreateQuery(product);
            IDocumentQuery<dynamic> query = _documentClient.CreateGremlinQuery<dynamic>(_graphCollection, createQuery);
            if(query.HasMoreResults)
            {
                await query.ExecuteNextAsync();
            }
        }

     public async Task<Product> Get(string id)
     {
        Product product = null;
        var getQuery = @"g.V('" + id + "')";
        var query = _documentClient.CreateGremlinQuery<dynamic>(_graphCollection, getQuery);
        if (query.HasMoreResults)
        {
            var result = await query.ExecuteNextAsync();
            if (result.Count == 0)
                return product;
            var productData = (JObject)result.FirstOrDefault();
            product = new Product
            {
               name = productData["name"].ToString()
            };
        }
        return product;
     }
    }
}

但是它不是可单元测试的,因此我想将其转换为IDocumentClient,但是IDocumentClient不包含CreateGremlinQuery的定义。那么转换我的方法以便它们将使用IDocumentClient的最佳方法是什么?我需要使用CreateDocumentQuery吗?如果是,如何将CreateGremlimQuery转换为CreateDocumentQuery?

1 个答案:

答案 0 :(得分:1)

有几种解决方法。最简单的方法就是将IDocumentClient强制转换为DocumentClient。

如果采用这种方法,您的代码将变为:

public class ProductRepository : IProductRepository
{
    private IDocumentClient _documentClient;
    private DocumentCollection _graphCollection;        

    public ProductRepository(IDocumentClient documentClient, DocumentCollection graphCollection)
    {
        _documentClient = documentClient;
        _graphCollection = graphCollection;

    }

    public async Task Create(Product product)
    {
        var createQuery = CreateQuery(product);
        IDocumentQuery<dynamic> query = ((DocumentClient)_documentClient).CreateGremlinQuery<dynamic>(_graphCollection, createQuery);
        if(query.HasMoreResults)
        {
            await query.ExecuteNextAsync();
        }
    }

     public async Task<Product> Get(string id)
     {
        Product product = null;
        var getQuery = @"g.V('" + id + "')";
        var query = ((DocumentClient)_documentClient).CreateGremlinQuery<dynamic>(_graphCollection, getQuery);
        if (query.HasMoreResults)
        {
            var result = await query.ExecuteNextAsync();
            if (result.Count == 0)
                return product;
            var productData = (JObject)result.FirstOrDefault();
            product = new Product
            {
               name = productData["name"].ToString()
            };
        }
        return product;
    }
}

您还可以为IDocumentClient创建自己的扩展名。

public static class MoreGraphExtensions
    {
        public static IDocumentQuery<T> CreateGremlinQuery<T>(this IDocumentClient documentClient, DocumentCollection collection, string gremlinExpression, FeedOptions feedOptions = null, GraphSONMode graphSONMode = GraphSONMode.Compact)
        {
            return GraphExtensions.CreateGremlinQuery<T>((DocumentClient)documentClient, collection, gremlinExpression, feedOptions, graphSONMode);
        }

        public static IDocumentQuery<object> CreateGremlinQuery(this IDocumentClient documentClient, DocumentCollection collection, string gremlinExpression, FeedOptions feedOptions = null, GraphSONMode graphSONMode = GraphSONMode.Compact)
        {
            return GraphExtensions.CreateGremlinQuery<object>((DocumentClient)documentClient, collection, gremlinExpression, feedOptions, graphSONMode);
        }
    }

但是它是一个预发布版本,因此我确实认为Microsoft会绕过接口级别的扩展方法。