gpt4 book ai didi

repository-pattern - 使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践

转载 作者:行者123 更新时间:2023-12-04 02:13:00 27 4
gpt4 key购买 nike

假设有两个存储库接口(interface):

interface IFooRepository
{
void Delete(int id);
}

interface IBarRepository
{
void Delete(int id);
}

还有一个 IUnitOfWork 接口(interface),例如:
interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}

使用 ServiceStack.ORMLite 实现这些接口(interface)的最佳实践是什么,以便用户可以像使用它们一样使用它们
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 中有一些替代解决方案可以在您需要引入任何模式之前保持您的代码“干燥”(特别是如果您主要寻求事务/回滚支持)。下面是我要开始的地方。

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://groups.google.com/forum/#!msg/servicestack/1pA41E33QII/R-trWwzYgjEJ - 讨论 ServiceStack 中的层

http://ayende.com/blog/3955/repository-is-the-new-singleton - Ayende Rahien(NHibernate 核心贡献者)关于 Repository 模式

关于repository-pattern - 使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14973648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com