0

問題を説明するのに苦労しています。でも、ここでもっといい仕事ができるかもしれません。

私の 4 層アーキテクチャ アプリケーションでは、倉庫管理システム (単純なもの) を備えたオンライン ストアですが、多くのビジネス ルールがあります。

例 1:

  1. Presentation Layerを呼び出しBusiness Layerて、Product
  2. BL.SaveProductメソッドは を呼び出してからDL.SaveProductメソッドをDL.DecreaseBalance呼び出します

で例外が発生した場合DL.DecreaseBalance、製品はビジネス ルールに違反して保存されます。DL に両方のトランザクションを処理させることで SoC にも違反できない場合

この問題を解決するのに役立つ設計パターンまたはトリックはありますか?

私のBLメソッド

    public static bool CreateProduct(Product Product, out string Message)
    {
        using (TransactionScope transactionScope = new TransactionScope())
        {
            try
            {
                //validate
                if (Product.ValidateNew(out Message))
                {
                    //Check if sufficient balance exists
                    if (ProductBulksBL.BulkHasEnoughBalance(Product.BulkID, 1))
                    {
                        //save
                        ProductsDAL.CreateProduct(Product, out Message);

                            //log
                            ProductCreationLogDTO pLog = new ProductCreationLogDTO();
                            pLog.BulkID = Product.BulkID;
                            pLog.CreatedBy = UsersDAL.GetCurrentUserID();
                            pLog.TimeCreated = DateTime.Now;

                            ProductsDAL.LogCreatedProduct(pLog, out Message);

                                //update bulk balance 
                                ProductBulksDAL.UpdateBulkBalance(Product.BulkID, 1);
                                return true;
                    }
                    else
                    {
                        Message = "This product bulks doesn't have enough balance";
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            catch (TransactionException ex)
            {
                Message = ex.Message;
                transactionScope.Dispose();
                return false;
            }
            finally
            {
                transactionScope.Complete();
                transactionScope.Dispose();
            }
        }
    }

すべてが同じアプローチを使用して構築された DL メソッドの例

    public static void CreateProduct(Product Product, out string Message)
    {
        using (SqlConnection conn = new SqlConnection(CONNECTION_STRING))
        {
            using (SqlCommand cmd = new SqlCommand("INSERT INTO Products (BulkID, CountryID, CityID, AreaID, Price, [Description], IPBan) VALUES (@BulkID, @CountryID, @CityID, @AreaID, @Price, @Description, @IPBan) ", conn))
            {
                cmd.Parameters.AddWithValue("@BulkID", Product.BulkID);
                cmd.Parameters.AddWithValue("@Price", Product.Price);
                cmd.Parameters.AddWithValue("@Description", Product.Description);
                cmd.Parameters.AddWithValue("@IPBan", Product.IPBan);

                if (Product.Country != null)
                    cmd.Parameters.AddWithValue("@CountryID", Product.Country.ID);
                else
                    cmd.Parameters.AddWithValue("@CountryID", DBNull.Value);

                if (Product.City != null)
                    cmd.Parameters.AddWithValue("@CityID", Product.City.ID);
                else
                    cmd.Parameters.AddWithValue("@CityID", DBNull.Value);

                if (Product.Area != null)
                    cmd.Parameters.AddWithValue("@AreaID", Product.Area.ID);
                else
                    cmd.Parameters.AddWithValue("@AreaID", DBNull.Value);

                    conn.Open();
                    cmd.ExecuteNonQuery();

                    Message = "";
            }
        }
    }

TransactionScope が機能していません

4

0 に答える 0