【问题标题】:Transactions in business logic layer业务逻辑层中的事务
【发布时间】:2013-10-04 12:43:14
【问题描述】:

我从https://stackoverflow.com/a/14988549/294022 窃取了以下代码。

这似乎是一个很好的抽象。但是,有一个问题。如果您想组合多个服务调用怎么办?

这可以很好地结合 DAL 调用。但是为了服务?有解决办法吗?

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

【问题讨论】:

    标签: c# .net design-patterns orm n-tier-architecture


    【解决方案1】:

    我认为您需要实现一个 UnitOfWork,它可以在希望参与单个“交易”的人之间传递/共享。

    【讨论】:

    • 创建一个代表 UnitOfWork 的接口,然后创建一个特定于 MsSql 的实现。使您的服务类依赖于接口,然后您可以传递实现。这样您的服务就可以使用当前的 UnitOfWork 或启动一个新的,等等。
    • 如何传递?参数-属性?
    • DI'd 通常是通过构造函数。
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2011-11-26
    • 2017-04-29
    • 2016-08-12
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多