Dapper et OrmLite IDBConnectionFactory dans ServiceStack

dapper oracle ormlite-servicestack servicestack

Question

Je suis impressionné par la rapidité avec laquelle je peux créer des services à l'aide de ServiceStack, mais depuis un certain temps je n'ai pas été en mesure de comprendre le concept d'utilisation simultanée d'OrmLite et de Dapper dans mon projet. J'enregistre un IDbConnectionFactory comme ceci dans mon Global.asax.cs

    public override void Configure(Funq.Container container)
        {
            var dbConnectionFactory =
                new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("test"), true, OracleDialect.Provider);

            container.Register<IDbConnectionFactory>(dbConnectionFactory);          
            container.Register<ISubscriberRepository>(
                c => new SubscriberRepository(c.Resolve<IDbConnectionFactory>()));
        }

Cela fonctionne très bien pour OrmLite mais ce n'est pas aussi simple pour Dapper. Peut-être que je pense simplement que cela devrait être plus pratique qu’elle ne l’est réellement. Dans mon référentiel, j'essaie d'appeler une procédure stockée Oracle. C'est la raison principale pour laquelle j'utilise Dapper et non OrmLite pour ce processus. Ceci est mon dépôt:

    public class SubscriberRepository : ISubscriberRepository {
    public SubscriberRepository(IDbConnectionFactory conn) {
        _conn = conn;
    }

    public IDbConnectionFactory _conn { get; set; }

    public SubscriberResponse GetSubscriber(SubscriberRequest request) {
        using (IDbConnection db = _conn.OpenDbConnection()) {
            var resp = new SubscriberResponse();

            List<Subscriber> s = db.Select<Subscriber>(
                q => q.Subscribernum == request.Subscribernum &&
                     q.Personcode == request.Personcode &&
                     q.Clientcode == request.Clientcode);

            resp.Subscriber = s[0];

            return resp;
        }
    }


    public SubscribersResponse SearchSubscribers(SubscribersRequest request) {
        var response = new SubscribersResponse();

        using (var cnn = new OracleConnection("this is my conneciton string")) {
            cnn.Open();

            var p = new OracleDynamicParameters();
            p.Add("@username", "uname", OracleDbType.Varchar2);
            p.Add("@Subscribernum", "", OracleDbType.Varchar2);
            p.Add("@Personcode", "", OracleDbType.Varchar2);
            p.Add("@Lastname", "TEST", OracleDbType.Varchar2);
            p.Add("@Firstname", "HA", OracleDbType.Varchar2);
            p.Add("@Mi", "", OracleDbType.Varchar2);
            p.Add("@Dob", null, OracleDbType.Date);
            p.Add("@MaxResults", 200, OracleDbType.Int32);
            p.Add("@Curs", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);

            using (SqlMapper.GridReader multi = cnn.QueryMultiple("SEARCHSUBSCRIBER", p,
                                                                  commandType: CommandType.StoredProcedure)) {
                List<SearchSubscriberResults> r = multi.Read<SearchSubscriberResults>().ToList();
                response.Results = r;
            }
        }
        return response;
    }
}

Cela marche. Mais il n'utilise pas vraiment IDbConnectionFactory dans la fonction SearchSubscribers. Je ne veux pas vraiment regarder les chaînes de connexion dans mon référentiel car je pourrais vraiment les enregistrer toutes au début dans le service lui-même.

J'ai essayé d'utiliser ServiceStack.Razor.Dapper.SqlMapper.QueryMultiple (), mais cela ne fonctionne pas car je ne peux pas associer Oracle sys_refcursor à quelque chose sans utiliser la solution de contournement OracleDynamicParamaters .

Alors, ma question est la suivante: puis-je créer une connexion pour Dapper à partir de IDBConnectionFactory?

Merci!

Réponse populaire

Je n'ai pas utilisé Oracle dans .NET (pas depuis mes jours Perl), mais OracleConnection implémente l'interface IDbConnection.

Vous devriez être capable de lancer la connexion à la base de données que vous récupérez depuis:

IDbConnection db = _conn.OpenDbConnection()

et le convertir en OracleConnection (en supposant que le fournisseur OrmLite crée cette même instance ).

var cnn = db as OracleConnection;

... alors vous pouvez essayer d'appeler tous ces trucs spécifiques à Oracle, comme OracleDynamicParameters.

Vous devrez peut-être définir cela dans AppHost.Configure () ou quelque part:

OrmLiteConfig.DialectProvider = new OracleOrmLiteDialectProvider();



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