問題を説明するのに苦労しています。でも、ここでもっといい仕事ができるかもしれません。
私の 4 層アーキテクチャ アプリケーションでは、倉庫管理システム (単純なもの) を備えたオンライン ストアですが、多くのビジネス ルールがあります。
例 1:
Presentation Layer
を呼び出しBusiness Layer
て、Product
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 が機能していません