Quelques questions concernant la combinaison de ADO.NET, Dapper QueryAsync et Glimpse.ADO

ado.net asp.net dapper glimpse

Question

J'ai expérimenté une solution légère pour gérer ma logique métier. Il s'agit d'une connexion vanilla ADO.NET étendue avec Dapper et surveillée par Glimpse.ADO . Le cas d'utilisation de cette configuration sera une application Web devant traiter une poignée de requêtes de manière asynchrone par requête. Ci-dessous, une simple implémentation de ma configuration dans un contrôleur MVC.

public class CatsAndDogsController : Controller
{
    public async Task<ActionResult> Index()
    {
        var fetchCatsTask = FetchCats(42);
        var fetchDogsTask = FetchDogs(true);
        await Task.WhenAll(fetchCatsTask, fetchDogsTask);
        ViewBag.Cats = fetchCatsTask.Result;
        ViewBag.Dogs = fetchDogsTask.Result;
        return View();
    }

    public async Task<IEnumerable<Cat>> FetchCats(int breedId)
    {
        IEnumerable<Cat> result = null;
        using (var connection = CreateAdoConnection())
        {
            await connection.OpenAsync();
            result = await connection.QueryAsync<Cat>("SELECT * FROM Cat WHERE BreedId = @bid;", new { bid = breedId });
            connection.Close();
        }
        return result;
    }

    public async Task<IEnumerable<Dog>> FetchDogs(bool isMale)
    {
        IEnumerable<Dog> result = null;
        using (var connection = CreateAdoConnection())
        {
            await connection.OpenAsync();
            result = await connection.QueryAsync<Dog>("SELECT * FROM Dog WHERE IsMale = @im;", new { im = isMale });
            connection.Close();
        }
        return result;
    }

    public System.Data.Common.DbConnection CreateAdoConnection()
    {
        var sqlClientProviderFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
        var dbConnection = sqlClientProviderFactory.CreateConnection();
        dbConnection.ConnectionString = "SomeConnectionStringToAwesomeData";
        return dbConnection;
    }
}

J'ai quelques questions concernant la création de la connexion dans la méthode CreateAdoConnection() . Je suppose que ce qui suit se passe dans les coulisses.

L'appel à sqlClientProviderFactory.CreateConnection() renvoie une instance de System.Data.SqlClient.SqlConnection transmise en tant que System.Data.Common.DbConnection . À ce stade, Glimpse.ADO.AlternateType.GlimpseDbProviderFactory et Glimpse.ADO.AlternateType.GlimpseDbProviderFactory cette connexion dans une instance de Glimpse.Ado.AlternateType.GlimpseDbConnection , également transmise en tant que System.Data.Common.DbConnection . Enfin, cette connexion est indirectement étendue par la bibliothèque Dapper avec ses méthodes de requête, parmi lesquelles la QueryAsync<>() utilisée pour récupérer les chats et les chiens.

Questions:

  1. L'hypothèse ci-dessus est-elle correcte?
  2. Si j'utilise les méthodes asynchrones de Dapper avec cette connexion - ou si je crée un System.Data.Common.DbCommand avec cette méthode CreateCommand() et utilise ses méthodes asynchrones - ces appels finiront-ils toujours par utiliser les implémentations asynchrones vanilla de ces méthodes Microsoft les a écrits pour System.Data.SqlClient.SqlConnection et System.Data.SqlClient.SqlCommand ? Et pas d'autres implémentations de ces méthodes qui bloquent réellement?
  3. Combien de perf est-ce que je perds avec cette configuration comparé à juste retourner un nouveau System.Data.SqlClient.SqlConnection directement? (Donc, sans le wrapper Glimpse.ADO)
  4. Des suggestions pour améliorer cette configuration?

Réponse acceptée

  1. Oui à peu près. GlimpseDbProviderFactory / décore / proxy toutes les usines enregistrées. Nous transmettons ensuite tous les appels que nous recevons à l'usine que nous emballons (dans ce cas, SQL Server). Dans le cas de CreateConnection() nous demandons à la fabrique interne dont nous disposons de créer une connexion. Lorsque nous obtenons cette connexion, nous l'enveloppons et la CreateConnection() à l'appelant d'origine.
  2. Oui. Glimpse ne transforme pas une requête asynchrone en requête de blocage. Nous persévérons cependant la chaîne asynchrone. Si vous êtes intéressé, le code en question est ici .
  3. Très peu. Essentiellement, l'utilisation d'un motif de décorateur comme celui-ci ajoute seulement une ou deux images à la pile d'appels. Comparé à la plupart des opérations effectuées pendant le cycle de vie de la requête, le temps nécessaire pour observer ce qui se passe est extrêmement minime.
  4. Ce que tu as a fière allure. Seule suggestion est peut-être de nous ce code pour construire l'usine. Ce code signifie que vous pouvez déplacer votre chaîne de connexion, etc. vers le fichier web.config.


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi