0

plsはこれを最初に見る: 良いコーディング慣行

だから、これは私のデザインです。

  1. Webサイト2.ビジネスロジックレイヤー3.DALFacade(sqlとdb2の2つの異なるストアを使用するため、データアクセスを非表示にするためにdalfacadeを使用します)4.DAL

DALでは、作業単位パターンとリポジトリパターンを使用します。1.ここでの大きな問題は、次のコードがビジネスロジックから作成されたトランザクションに対して正常に実行されるかどうかです。

Page:

public partial class NewBonusRequest : System.Web.UI.Page
{

    #region Constructor and Instantiation of Business Logic
        /// <summary>
        /// Property that holds the Business Logic type to call methods
        /// </summary>
        public IRequestBL RequestBL { get; private set; }

        /// <summary>
        /// The default constructor will use the default implementation of the business logic interface
        /// </summary>
        public Request()
            : this(new RequestBL())
        {
        }

        /// <summary>
        /// The constructor accepts a IEcoBonusRequestFacade type
        /// </summary>
        /// <param name="ecoBonusRequestBL">IEcoBonusRequestFacade type</param>
        public NewRequest(IRequestBL RequestBL)
        {
            RequestBL = RequestBL;
        } 
    #endregion


    protected void PageLoad(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
        {

        }
    }


    #region Control Events
        protected void BtnSubmitRequestClick(object sender, EventArgs e)
        {
            var request= new Request
                                       {
                                           IsOnHold = true
                                           //All other properties go here.
                                       };

            RequestBL.Save(request);
        }



    Business Logic Code.

    public interface IRequestBL
    {
        void Save(Request request);
    }

    /// <summary>
    /// Class in charge of the business logic for EcoBonusRequest
    /// </summary>
    public class RequestBL : IRequestBL
    {
        /// <summary>


        /// <summary>
        /// Saves a new ecobonus request into database and evaluate business rules here
        /// </summary>
        /// <param name="ecoBonusWorkflow">EcoBonusWorkflow entity</param>
        public void Save(Request Request)
        {
            using (var scope = new TransactionScope())
            {
                Request.Save(request);
                // Call to other DALCFacade methods that insert data in different tables
                // OtherObject.Save(otherobject)
                scope.Complete();
            }
        }
    }
4

1 に答える 1

1

はい、同じスレッドで、EFはトランザクションスコープが存在する場合はそれを適切に考慮します。EFは、すでに1つになっている場合、新しいトランザクションを作成しません。

ただし、トランザクションなしでデータベースにクエリを実行すると、ダーティリードが発生するため、注意が必要です。EFは、トランザクションが存在しない場合は何も読み取らないが、変更を保存しているときに存在しない場合は新しいトランザクションを作成するためです。

コードでは、トランザクションの変更のみを保存していますが、読み取るときは注意が必要であり、クエリもスコープ内で小さな単位にカプセル化する必要があります。

于 2012-05-08T08:15:24.857 に答える