業務邏輯層


  • 業務邏輯層是應用程序的大腦:
  1. 負責處理系統的業務邏輯,
  2. 負責對用戶定義的流程進行建模,
  3. 負責數據訪問層和展示層的通訊,
  4. 負責將錯誤信息返回給展示層。

業務邏輯層,不能因為數據庫的變換而變化,也不能因為終端的變換而變化。

業務邏輯層在此架構中包含IBLL,BLL,WFActivitys和WFDesigner四個項目。

1. BLL——業務邏輯

業務邏輯的操作,包括業務處理,調用數據訪問,事務等。

2. IBLL——業務接口

業務邏輯層的方法對外暴露的接口和服務契約

3. WFActivitys——工作流活動層

定義了工作流中使用的活動

4. WFDesigner——工作流設計器

在此將工作流活動安裝一定的業務規則組織在一起,設計工作流的業務流程 

 

  • 接口

 

View Code
using System; using System.Collections.Generic; using System.Linq; using Common; using Langben.DAL; using System.ServiceModel; namespace Langben.IBLL { /// <summary>
    /// 異常處理 接口 /// </summary>
    [ServiceContract(Namespace = "www.langben.com")] public interface ISysExceptionBLL { /// <summary>
        /// 查詢的數據 /// </summary>
        /// <param name="id">額外的參數</param>
        /// <param name="page">頁碼</param>
        /// <param name="rows">每頁顯示的行數</param>
        /// <param name="order">排序字段</param>
        /// <param name="sort">升序asc(默認)還是降序desc</param>
        /// <param name="search">查詢條件</param>
        /// <param name="total">結果集的總數</param>
        /// <returns>結果集</returns>
 [OperationContract] IQueryable<SysException> GetByParam(string id, int page, int rows, string order, string sort, string search, ref int total); /// <summary>
        /// 獲取所有 /// </summary>
        /// <returns></returns>
 [OperationContract] System.Collections.Generic.List<SysException> GetAll(); /// <summary>
        /// 根據主鍵,查看詳細信息 /// </summary>
        /// <param name="id">根據主鍵</param>
        /// <returns></returns>
 [OperationContract] SysException GetById(string id); /// <summary>
        /// 創建一個對象 /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entity">一個對象</param>
        /// <returns></returns>
 [OperationContract] bool Create(ref Common.ValidationErrors validationErrors, DAL.SysException entity); /// <summary>
        /// 創建對象集合 /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entitys">對象集合</param>
        /// <returns></returns>
 [OperationContract] bool CreateCollection(ref Common.ValidationErrors validationErrors, System.Linq.IQueryable<DAL.SysException> entitys); /// <summary>
        /// 刪除一個對象 /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="id">一條數據的主鍵</param>
        /// <returns></returns>  
 [OperationContract] bool Delete(ref Common.ValidationErrors validationErrors, string id); /// <summary>
        /// 刪除對象集合 /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="deleteCollection">主鍵的集合</param>
        /// <returns></returns>       
 [OperationContract] bool DeleteCollection(ref Common.ValidationErrors validationErrors, string[] deleteCollection); /// <summary>
        /// 編輯一個對象 /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entity">一個對象</param>
        /// <returns></returns>
 [OperationContract] bool Edit(ref Common.ValidationErrors validationErrors, DAL.SysException entity); /// <summary>
        /// 創建對象集合 /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entitys">對象集合</param>
        /// <returns></returns>
 [OperationContract] bool EditCollection(ref Common.ValidationErrors validationErrors, System.Linq.IQueryable<DAL.SysException> entitys); } }

 

  • 實現

 

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;
using Langben.DAL;
using Common;

namespace Langben.BLL
{
    /// <summary>
    /// 異常處理 
    /// </summary>
    public class SysExceptionBLL : BaseBLL, Langben.IBLL.ISysExceptionBLL
    {
        /// <summary>
        /// 私有的數據訪問上下文
        /// </summary>
        protected SysEntities db;
        /// <summary>
        /// 異常處理的數據庫訪問對象
        /// </summary>
        SysExceptionRepository repository = null;
        /// <summary>
        /// 構造函數,默認加載數據訪問上下文
        /// </summary>
        public SysExceptionBLL()
        {
            db = new SysEntities();
            repository = new SysExceptionRepository();
        }
        /// <summary>
        /// 已有數據訪問上下文的方法中調用
        /// </summary>
        /// <param name="entities">數據訪問上下文</param>
        public SysExceptionBLL(SysEntities entities)
        {
            db = entities;
            repository = new SysExceptionRepository();
        }
        /// <summary>
        /// 查詢的數據
        /// </summary>
        /// <param name="id">額外的參數</param>
        /// <param name="page">頁碼</param>
        /// <param name="rows">每頁顯示的行數</param>
        /// <param name="order">排序字段</param>
        /// <param name="sort">升序asc(默認)還是降序desc</param>
        /// <param name="search">查詢條件</param>
        /// <param name="total">結果集的總數</param>
        /// <returns>結果集</returns>
        public IQueryable<SysException> GetByParam(string id, int page, int rows, string order, string sort, string search, ref int total)
        {
            IQueryable<SysException> queryData = repository.DaoChuData(db, order, sort, search);
            total = queryData.Count();
            if (total > 0)
            {
                if (page <= 1)
                {
                    queryData = queryData.Take(rows);
                }
                else
                {
                    queryData = queryData.Skip((page - 1) * rows).Take(rows);
                }

            }
            return queryData;
        }
        /// <summary>
        /// 創建一個異常處理
        /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="db">數據庫上下文</param>
        /// <param name="entity">一個異常處理</param>
        /// <returns></returns>
        public bool Create(ref ValidationErrors validationErrors, SysException entity)
        {
            try
            {
                return repository.Create(entity) == 1;
            }
            catch (Exception ex)
            {
                validationErrors.Add(ex.Message);
                ExceptionsHander.WriteExceptions(ex);
            }
            return false;
        }
        /// <summary>
        ///  創建異常處理集合
        /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entitys">異常處理集合</param>
        /// <returns></returns>
        public bool CreateCollection(ref ValidationErrors validationErrors, IQueryable<SysException> entitys)
        {
            try
            {
                if (entitys != null)
                {
                    int count = entitys.Count();
                    if (count == 1)
                    {
                        return this.Create(ref validationErrors, entitys.FirstOrDefault());
                    }
                    else if (count > 1)
                    {
                        using (TransactionScope transactionScope = new TransactionScope())
                        {
                            repository.Create(db, entitys);
                            if (count == repository.Save(db))
                            {
                                transactionScope.Complete();
                                return true;
                            }
                            else
                            {
                                Transaction.Current.Rollback();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                validationErrors.Add(ex.Message);
                ExceptionsHander.WriteExceptions(ex);
            }
            return false;
        }
        /// <summary>
        /// 刪除一個異常處理
        /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="id">一異常處理的主鍵</param>
        /// <returns></returns>  
        public bool Delete(ref ValidationErrors validationErrors, string id)
        {
            try
            {
                return repository.Delete(id) == 1;
            }
            catch (Exception ex)
            {
                validationErrors.Add(ex.Message);
                ExceptionsHander.WriteExceptions(ex);
            }
            return false;
        }
        /// <summary>
        /// 刪除異常處理集合
        /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="deleteCollection">異常處理的集合</param>
        /// <returns></returns>    
        public bool DeleteCollection(ref ValidationErrors validationErrors, string[] deleteCollection)
        {
            try
            {
                if (deleteCollection != null)
                {
                    using (TransactionScope transactionScope = new TransactionScope())
                    {
                        repository.Delete(db, deleteCollection);
                        if (deleteCollection.Length == repository.Save(db))
                        {
                            transactionScope.Complete();
                            return true;
                        }
                        else
                        {
                            Transaction.Current.Rollback();
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                validationErrors.Add(ex.Message);
                ExceptionsHander.WriteExceptions(ex);
            }
            return false;
        }
        /// <summary>
        ///  創建異常處理集合
        /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entitys">異常處理集合</param>
        /// <returns></returns>
        public bool EditCollection(ref ValidationErrors validationErrors, IQueryable<SysException> entitys)
        {
            try
            {
                if (entitys != null)
                {
                    int count = entitys.Count();
                    if (count == 1)
                    {
                        return this.Edit(ref validationErrors, entitys.FirstOrDefault());
                    }
                    else if (count > 1)
                    {
                        using (TransactionScope transactionScope = new TransactionScope())
                        {
                            repository.Edit(db, entitys);
                            if (count == repository.Save(db))
                            {
                                transactionScope.Complete();
                                return true;
                            }
                            else
                            {
                                Transaction.Current.Rollback();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                validationErrors.Add(ex.Message);
                ExceptionsHander.WriteExceptions(ex);
            }
            return false;
        }
        /// <summary>
        /// 編輯一個異常處理
        /// </summary>
        /// <param name="validationErrors">返回的錯誤信息</param>
        /// <param name="entity">一個異常處理</param>
        /// <returns></returns>
        public bool Edit(ref ValidationErrors validationErrors, SysException entity)
        {
            try
            {
                repository.Edit(db, entity);
                return repository.Save(db) == 1;
            }
            catch (Exception ex)
            {
                validationErrors.Add(ex.Message);
                ExceptionsHander.WriteExceptions(ex);
            }
            return false;
        }

        public List<SysException> GetAll()
        {
            return repository.GetAll(db).ToList();
        }

        /// <summary>
        /// 根據主鍵獲取一個異常處理
        /// </summary>
        /// <param name="id">異常處理的主鍵</param>
        /// <returns>一個異常處理</returns>
        public SysException GetById(string id)
        {
            return repository.GetById(db, id);
        }


    }
}

 

 

 

在業務邏輯層使用事務和處理異常信息,因為服務層和展示層都會調用,保證此層是業務的最小邏輯單元,所以在此層做事務和異常的處理,TransactionScope類是一個分布式事務類,ExceptionsHander類是處理異常的類。 

更新的時候會面臨一個難點,如果用戶在屏幕上調出一條記錄,看了兩分鍾,然后進行修改,最后保存到數據庫,系統應該只對用戶最開始所看到的那條記錄進行更新。如果在第一個客戶看的兩分鍾中,其他的客戶成功的對該數據進行了修改,則第一個客戶保存到數據庫不應該成功。解決此問題,可以在該數據表中增加一個TimeStamp字段。 

  • 我們約定:

1.將系統需要的基礎類放在"Framework"文件夾中

2.每個業務邏輯層的方法都有兩個構造函數,SysExceptionBLL(SysEntities entities)是在其他業務邏輯層方法調用的時候使用,保證一個業務單元使用一個上下文。 

此架構的代碼實現,請參考 http://files.cnblogs.com/langben/www.langben.com.zip

 

以上我們完成了數據訪問層的設計,下一章我們實現展示層的代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM