Как конвертировать DocumentClient в IDocumentClient в Гремлине? - PullRequest
0 голосов
/ 15 ноября 2018

Я использую 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 голосов
/ 15 ноября 2018

Есть несколько способов обойти это. Самым простым было бы просто жестко привести ваш 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 справится с перемещением методов расширения на уровне интерфейса.

...