Dapper y OrmLite IDBConnectionFactory en ServiceStack

dapper oracle ormlite-servicestack servicestack

Pregunta

Estoy impresionado con la velocidad con la que puedo crear servicios usando ServiceStack, pero por un tiempo no he podido entender el concepto de usar OrmLite y Dapper simultáneamente en mi proyecto. Estoy registrando un IDbConnectionFactory como este en mi 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>()));
        }

Eso funciona bien para OrmLite, pero no es tan simple para Dapper. Tal vez solo estoy pensando que esto debería ser más conveniente de lo que realmente es. En mi repositorio estoy tratando de llamar a un procedimiento almacenado de Oracle. Esa es mi razón principal para usar Dapper y no OrmLite para este proceso. Este es mi repositorio

    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;
    }
}

Esto funciona. Pero en realidad no usa el IDbConnectionFactory en absoluto en la función SearchSubscribers. No quiero ver las cadenas de conexión en mi repositorio porque realmente podría registrarlas todas en el propio servicio.

Traté de utilizar ServiceStack.Razor.Dapper.SqlMapper.QueryMultiple () pero eso no funciona porque no puedo volver a asignar Oracle sys_refcursor a nada sin utilizar la solución OracleDynamicParamaters .

Entonces, mi pregunta es, ¿puedo crear una conexión para Dapper desde IDBConnectionFactory?

¡Gracias!

Respuesta popular

No he usado Oracle en .NET (no desde mis días Perl), pero OracleConnection implementa la interfaz IDbConnection.

Deberías poder convertir la conexión db de la que tomas:

IDbConnection db = _conn.OpenDbConnection()

y lanzarlo a OracleConnection (suponiendo que el proveedor de OrmLite crea la misma instancia ).

var cnn = db as OracleConnection;

... entonces puedes intentar llamar a todas las cosas específicas de Oracle, como OracleDynamicParameters.

Es posible que deba configurar esto en AppHost.Configure () o en alguna parte:

OrmLiteConfig.DialectProvider = new OracleOrmLiteDialectProvider();


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow