Best practices of implementing unit of work and repository pattern using ServiceStack.ORMLite

前端 未结 1 818
鱼传尺愫
鱼传尺愫 2021-01-02 04:39

Supposing that there are two repository interface :

interface IFooRepository
{
    void Delete(int id);
}

interface IBarRepository
{
    void Delete(int id)         


        
相关标签:
1条回答
  • 2021-01-02 05:01

    Not sure of your need for Repository + UnitOfWork patterns but I think there are some alternative solutions in ServiceStack + OrmLite that keep your code 'DRY' before you need to introduce any patterns (especially if you're mainly seeking Transaction/Rollback support). Something like below is where I would start.

    public class Foo //POCO for data access
    {
        //Add Attributes for Ormlite
        public int Id { get; set;  }
    }
    
    public class Bar //POCO for data access
    {
        //Add Attributes for Ormlite
        public int Id { get; set; }
    }
    
    //your request class which is passed to your service
    public class DeleteById 
    {
        public int Id { get; set; }
    }
    
    public class FooBarService : MyServiceBase //MyServiceBase has resusable method for handling transactions. 
    {
        public object Post(DeleteById request)
        {
            DbExec(dbConn =>
                       {
                           dbConn.DeleteById<Foo>(request.Id);
                           dbConn.DeleteById<Bar>(request.Id);
                       });
    
            return null;
        }
    }
    
    public class MyServiceBase : Service
    {
        public IDbConnectionFactory DbFactory { get; set; }
    
        protected void DbExec(Action<IDbConnection> actions)
        {
            using (var dbConn = DbFactory.OpenDbConnection())
            {
                using (var trans = dbConn.OpenTransaction())
                {
                    try
                    {
                        actions(dbConn);
                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        throw ex;
                    }
                }
            }
        }
    } 
    

    Some references...

    https://github.com/ServiceStack/ServiceStack.RedisWebServices - The above code is modified from this example

    https://groups.google.com/forum/#!msg/servicestack/1pA41E33QII/R-trWwzYgjEJ - discussion about layers in ServiceStack

    http://ayende.com/blog/3955/repository-is-the-new-singleton - Ayende Rahien (NHibernate core contributor) on Repository pattern

    0 讨论(0)
提交回复
热议问题