Asp.Net MVC体験3ビジネス層の構築

6951 ワード

ビジネス層の80%のコードはdal層を再包装することです.ソフトウェア開発は、重複を排除し、再利用を向上させることです.ある牛人は、繰り返しを消す最善の方法は絶えず抽象的だと言った.
私は以前、BIZ層におけるRepositoryの応用についてという文章を持っていましたが、ずっと実践していませんでした.今になって、当初のこの考えは本当に素晴らしいことに気づきました.Web Formにも適用されます.
1.IBaseBizを見てみましょう.cs
public interface IBaseBiz<T>
{
    T Get(object id);
    IQueryable<T> FindAll();
    bool IsExists(Expression<Func<T, bool>> predicate);
    void Add(T entity);
    void Add(List<T> entitys);
    void Delete(T entity);
    void Delete(List<T> entitys);
    void Delete(Expression<Func<T, bool>> predicate);
}

これとIrespositorycsは基本的に同じですが、なぜインタフェースを書き直すのでしょうか.
機能的には確かに変わらないが、職責的に区別すれば違いがある.
 
2.ベースクラス実装BaseBiz
public class BaseBiz<T> : IBaseBiz<T>
{
    protected static readonly ILog logger = LogManager.GetLogger(typeof(BaseBiz<>));
 
    protected IRepository<T> _repository;
 
    public BaseBiz(IRepository<T> repository)
    {
        _repository = repository;
    }
 
    #region IBaseBiz<T>   
 
    public T Get(object id)
    {
        return _repository.Get(id);
    }
 
    public IQueryable<T> FindAll()
    {
        return _repository.FindAll();
    }
 
    public bool IsExists(Expression<Func<T, bool>> predicate)
    {
        return _repository.IsExists(predicate);
    }
 
    public void Add(T entity)
    {
        using (IUnitOfWork unitOfWork = KnowDataContext.Begin())
        {
            _repository.Add(entity);
            unitOfWork.Commit();
        }
    }
 
    public void Add(List<T> entitys)
    {
        _repository.Add(entitys);
    }
 
    public void Delete(T entity)
    {
        _repository.Delete(entity);
    }
 
    public void Delete(List<T> entitys)
    {
        _repository.Delete(entitys);
    }
 
    public void Delete(Expression<Func<T, bool>> predicate)
    {
        using (IUnitOfWork unitOfWork = KnowDataContext.Begin())
        {
            _repository.Delete(predicate);
            unitOfWork.Commit();
        }
    }
    #endregion
}

すべての単純パッケージdalレイヤのコードはすべてこのベースクラスに抽象化されています.これで具体的なビジネスクラスは複雑なビジネスロジックのみを担当し,クラスはきれいになり,重複コードも消滅した.
 
3.業務類QuestionBiz
public class QuestionBiz : BaseBiz<Question>
{
 
    public QuestionBiz(IRepository<Question> repository)
        : base(repository)
    {
 
    }
 
    public IQueryable<Question> GetQuestionByUser(string userId)
    {
        return _repository.FindAll().GetQuestionByUser(userId);
    }
}

 
メソッド呼び出しの順序を見てみましょう
irepository->linqrepository->ibasebiz->basebiz->questionbiz
 
basebizはlinqrepositoryのようにデータアクセスを1つのクラスに抽象化することはできません.ビジネスロジックは柔軟で、ニーズに応じて絶えず変化するので、questionbizのような具体的なビジネスクラスが実現する必要があります.これが物事が2面性、共通性、特性を持っていることです.共通性はbasebizと抽象化することができ、特性は継承ベースクラスとその独特な変化を持つ実装クラスを実現しなければならない.