【问题标题】:Dapper and OrmLite IDBConnectionFactory in ServiceStackServiceStack 中的 Dapper 和 OrmLite IDBConnectionFactory
【发布时间】:2013-03-26 18:05:59
【问题描述】:

我对使用 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 创建一个连接吗?

谢谢!

【问题讨论】:

    标签: oracle servicestack dapper ormlite-servicestack


    【解决方案1】:

    我没有在 .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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多