ServiceStackのDapperとOrmLiteのIDBConnectionFactory

dapper oracle ormlite-servicestack servicestack

質問

私はServiceStackを使用してサービスを作成することができるという速度に感心していますが、今はOrmLiteとDapperをプロジェクトで同時に使用するという概念を理解できませんでした。私はこのようなIDbConnectionFactoryを自分の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>()));
        }

OrmLiteではうまく動作しますが、Dapperにとってはそれほど簡単ではありません。たぶん私はこれが実際よりももっと便利であるべきだと思っているだけです。私のリポジトリでは、Oracleストアドプロシージャを呼び出そうとしています。これが、Dapperを使用し、OrmLiteをこのプロセスに使用しなかった主な理由です。これは私のリポジトリです:

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

これは機能します。しかし、実際にはSearchSubscribers関数でIDbConnectionFactoryを全く使用していません。私は自分のリポジトリ内の接続文字列を実際にはサービス自体の前にすべて登録することができるので、実際には接続文字列を見たくありません。

ServiceStack.Razor.Dapper.SqlMapper.QueryMultiple()を使用しようとしましたが、Oracleのsys_refcursorをOracleDynamicParamatersの回避策を使用せずに戻すことができないため、動作しません。

だから、私の質問は、IDBConnectionFactoryからDapperへの接続を作成できますか?

ありがとう!

人気のある回答

私は.NETでOracleを使用していませんが(Perlの日以降ではありません)、Oracle ConnectionはIDbConnectionインタフェースを実装しています。

あなたはあなたがつかむDB接続をキャストすることができるはずです:

IDbConnection db = _conn.OpenDbConnection()

OrmLiteプロバイダが同じインスタンスを作成すると仮定してOracleConnectionにキャストします。

var cnn = db as OracleConnection;

... OracleDynamicParametersのようなOracle特有のものすべてを呼び出すことができます。

これをAppHost.Configure()またはどこかで設定しなければならないかもしれません:

OrmLiteConfig.DialectProvider = new OracleOrmLiteDialectProvider();


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ