Ajouter Dapper à la bibliothèque d'entreprise?

.net dapper enterprise-library orm

Question

Nous utilisons la bibliothèque d'entreprise en tant que DAL standard. Maintenant, j'aimerais profiter des avantages de Dapper. En regardant l'implémentation, il ne s'agit que d'étendre la classe de connexion.

Est-il envisageable d’étendre Dapper à Enterprise Library pour que nous puissions profiter des deux mondes? Ou peut-être que quelqu'un l'a déjà créé?

Réponse acceptée

Oui, c'est concevable, et ça marche plutôt bien. Nous utilisons Dapper pour compléter certains anciens codes EntLib, et les requêtes simples sont rapides et sans douleur. Le plus grand défi consistait à faire fonctionner correctement les transactions. Vous ne mentionnez pas la version d'EntLib que vous utilisez, mais 4.0 et les versions plus récentes gèrent les connexions à l'intérieur de TransactionScopes. Par conséquent, si vous essayez d'ouvrir une autre connexion pour Dapper avec EntLib, elle passera automatiquement d'une transaction locale légère à DTC. (Coordinateur de transactions distribuées). EntLib ne fournit pas vraiment un moyen de saisir la connexion ouverte actuelle. Vous devez donc dériver de la classe Database et exposer la méthode GetOpenConnection.

public class EntLibDatabaseWrapper : Database
{
    // ...Constructor and overrides...

    public IDbConnection GetMyOpenConnection()
    {
        var connectionWrapper = GetOpenConnection();
        return connectionWrapper.Connection;
    }
}

Ensuite, utilisez quelque chose comme ceci:

var db = DatabaseFactory.CreateDatabase();
var dbWrapper = new EntLibDatabaseWrapper(db.ConnectionString, db.DbProviderFactory);

using (var scope = new TransactionScope())
{
    var connection = dbWrapper.GetMyOpenConnection();

    try
    {
        var fooId = 
            connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int", 
                                    new { name = "Foo" }).Single();
        var cmd =
            db.GetSqlStringCommand(
                "insert into Foo values (name = 'Bar'); select cast(scope_identity() as int)");
        var barId = int.Parse(db.ExecuteScalar(cmd));
        scope.Complete();
    }
    catch (Exception)
    {
        connection.Close();
        throw;
    }
}

Si vous avez des portées de transaction plus importantes, vous devez vérifier si vous êtes dans une transaction active avant de fermer chaque connexion.

if(Transaction.Current == null)
     connection.Close();

Réponse populaire

Pourquoi utiliseriez-vous Enterprise Library si vous ne pouvez utiliser que Dapper? Au lieu d'utiliser DataSets et DataReaders, vous pouvez exécuter des requêtes qui renvoient des objets mappés fortement typés.




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