我对使用ServiceStack创建服务的速度印象深刻,但有一段时间我现在无法掌握在项目中同时使用OrmLite和Dapper的概念。我在Global.asax.cs
中注册了这样的IDbConnectionFactory 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(),但这不起作用,因为我无法在不使用OracleDynamicParamaters解决方法的情况下将Oracle sys_refcursor映射回任何内容。
所以,我的问题是我可以从IDBConnectionFactory为Dapper创建连接吗?
谢谢!
答案 0 :(得分:0)
我没有在.NET中使用Oracle(自从我的Perl时代以来),但OracleConnection实现了接口IDbConnection。
您应该能够从中获取数据库连接:
IDbConnection db = _conn.OpenDbConnection()
并将其转换为OracleConnection(假设为the OrmLite provider creates that same instance)。
var cnn = db as OracleConnection;
...然后你可以尝试调用所有特定于Oracle的东西,比如OracleDynamicParameters。
您可能必须在AppHost.Configure()或其他地方设置此项:
OrmLiteConfig.DialectProvider = new OracleOrmLiteDialectProvider();