How to use Dapper in ServiceStack

2019-04-05 08:36发布

问题:

Currently, I am using OrmLite for DB operations. I am also planning to use Dapper ORM, but can anyone point me how to integrate DapperORM in ServiceStack. Do I need to implement both IDbConnection and IDbConnectionFactory interfaces with Dapper and plugin into the container.

  public override void Configure(Container container) {
        container.Register<IDbConnectionFactory>(
          c => new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["default"].ConnectionString,
                                            SqlServerDialect.Provider));

        container.Register<IDbConnection>(c => c.Resolve<IDbConnectionFactory>().OpenDbConnection()).ReusedWithin(ReuseScope.Request);

      }

回答1:

Dapper works like OrmLite in that they're both extension methods over the underlying ADO.NET System.Data.* IDbConnection interface. This means you can use both of them together on the IDbConnection retrieved from OrmLite's IDbConnectionFactory.

OrmLite includes a recent version of Dapper in ServiceStack.OrmLite under the ServiceStack.OrmLite.Dapper namespace.


In v3.9.40 of ServiceStack, this embedded version of Dapper had their APIs changed to include a 'Dapper' suffix to avoid clashing with OrmLite methods of the same name. You don't have to register a Request-Scoped IDbConnection as ServiceStack's default Service class already retrieves it from the IDbConnectionFactory for you.

Given that, here's how you can access Dapper ORM APIs inside a ServiceStack service:

public class MyService : Service
{
    public object Any(Request request)
    {
        base.Db.QueryDapper(...);
        base.Db.QueryMultipleDapper(...);
        base.Db.MultiMapDapper(...);
        base.Db.ExecuteDapper(...);
    }
}


回答2:

I don't know about others, but due to the information regarding Dapper within the Razor namespace this answer confused me quite a bit.

In case others have a similar experience, I've attempted to answer this same question in a basic way.