ServiceStack의 Dapper 및 OrmLite IDBConnectionFactory

dapper oracle ormlite-servicestack servicestack

문제

나는 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 ()을 사용하려고 시도했으나 Oracle sys_refcursor를 OracleDynamicParamaters 대안을 사용하지 않고 다시 매핑 할 수 없기 때문에 작동하지 않습니다.

그래서, 내 질문에 IDBConnectionFactory에서 Dapper에 대한 연결을 만들 수 있습니까?

감사!

인기 답변

필자는 .NET에서 Oracle을 사용하지 않았지만 (Perl 시대 이후), OracleConnection은 인터페이스 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
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow