使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践 [英] Best practices of implementing unit of work and repository pattern using ServiceStack.ORMLite

查看:40
本文介绍了使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设有两个存储库接口:

Supposing that there are two repository interface :

interface IFooRepository
{
    void Delete(int id);
}

interface IBarRepository
{
    void Delete(int id);
}

还有一个 IUnitOfWork 接口,如:

And an IUnitOfWork interface like :

interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

使用 ServiceStack.ORMLite 实现这些接口的最佳实践是什么,以便用户可以像使用它们一样

what is the best practices of implementing those interface using ServiceStack.ORMLite so that user can use them like

MyFooRepository.Delete(4);
// if an Exception throws here, Bar won't be deleted
MyBarRepository.Delete(7);

using (var uow = CreateUnitOfWork())
{
    MyFooRepository.Delete(4);
    MyBarRepository.Delete(7);
    uow.Commit();  //now they are in an transaction
}

推荐答案

不确定您是否需要 Repository + UnitOfWork 模式,但我认为 ServiceStack + OrmLite 中有一些替代解决方案可以让您的代码在需要之前保持DRY"引入任何模式(特别是如果您主要寻求事务/回滚支持).下面是我要开始的地方.

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;
                }
            }
        }
    }
} 

一些参考...

https://github.com/ServiceStack/ServiceStack.RedisWebServices - 以上代码修改自本例

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

https://groups.google.com/forum/#!msg/servicestack/1pA41E33QII/R-trWwzYgjEJ - 关于ServiceStack层的讨论

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 核心贡献者)关于 Repository 模式

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

这篇关于使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆