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 ストアド プロシージャを呼び出そうとしています。これが、このプロセスに OrmLite ではなく Dapper を使用する主な理由です。これは私のリポジトリです:
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() を使用しようとしましたが、 OracleDynamicParamaters回避策を使用しないと Oracle sys_refcursor を何にもマップできないため、機能しません。
それで、私の質問は、IDBConnectionFactory から Dapper への接続を作成できますか?
ありがとう!