簡體   English   中英

Asp.Net MVC分層體系結構中的循環依賴

[英]Circular Dependencies in Asp.Net MVC Layerd Architecture

我是Asp.Net MVC的新手,我想將我的項目拆分為具有1- MVC項目(表示層UI層)2-業務邏輯層BLL的分層體系結構(在這里我想驗證數據視圖模型並將視圖模型轉換為數據庫模型使用自動映射器,然后希望通過使用自動映射器轉換回ui(MVC項目)第3層來返回視圖模型。數據訪問層具有存儲庫DB Context等,我只想在業務層中引用。

我的困惑是在業務邏輯層和MVC項目(UI)層之間。 我的視圖模型類位於MVC項目內的Model文件夾中,而業務邏輯層引用了具有數據庫表類的數據訪問層。 因此我的視圖模型在業務邏輯層中無法識別。 如果我想添加MVC項目(存在我的視圖模型的地方)對業務邏輯層的引用,則會給出循環依賴錯誤。 我在論壇和教程上進行了大量搜索,但未能找到解決方案或無法理解該概念。

我的業務邏輯層和數據訪問層是庫項目,而UI層是MVC項目

如果有人可以通過將數據視圖模型發送到業務邏輯層並從業務邏輯層接收后視圖模型來舉例說明,

資料存取層

namespace DAL.Infrastructure.Contract
{

    public interface IBaseRepository<T> : IDisposable where T : class
    {
        IEnumerable<T> GetAll();
        IEnumerable<T> FindIEnumerableByExpression(Expression<Func<T, bool>> predicate);
        T FindFirstOrDefaultByExpression(Expression<Func<T, bool>> predicate);
        T GetById(object Id);
        T Insert(T entity);
        T Delete(T entity);
        void Update(T entity);
        void Save();
    }
}



namespace DAL.Infrastructure
{
    public class BaseRepository<T> : IBaseRepository<T> where T : class
    {
        public PMSEntities dbContext = null;
        public DbSet<T> dbSet = null;

        public BaseRepository()
        {
            this.dbContext = new PMSEntities();
            dbSet = dbContext.Set<T>();
        }

        public virtual IEnumerable<T> GetAll()
        {
            return dbSet.AsEnumerable<T>();
        }

        public T GetById(object id)
        {
            return this.dbSet.Find(id);
        }

        public IEnumerable<T> FindIEnumerableByExpression(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            IEnumerable<T> query = dbSet.Where(predicate).AsEnumerable();
            return query;
        }

        public T FindFirstOrDefaultByExpression(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return this.dbSet.FirstOrDefault(predicate);
        }

        public virtual T Insert(T entity)
        {
            return dbSet.Add(entity);
        }

        public virtual T Delete(T entity)
        {
            return dbSet.Remove(entity);
        }

        public virtual void Update(T entity)
        {
            dbContext.Entry(entity).State = System.Data.Entity.EntityState.Modified;
        }

        public void Save()
        {
            dbContext.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    dbContext.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}

我想在業務邏輯層而不是直接在控制器中使用以上類。 這是我的困惑,如何在具有循環依賴項錯誤的業務邏輯層中編寫業務邏輯層並使用自動映射器

ViewModels不應成為業務邏輯層的一部分,因為它們僅用於表示。 現在如何組織它,以便業務需要UI / View,這需要開始業務,需要UI / View來開始(重復...)

UI / View可能知道業務層,但反過來卻不知道。 因此,執行此操作的“正確”方法是首先將數據庫信息映射到Plain Old C#對象,您的UI層可能會在業務層中要求該對象。 之后,UI層可以通過將其轉換為經過優化以顯示該信息的類ViewModel來完成其工作。 這並不意味着您必須在控制器內部執行此操作,您可以在UI / View項目中添加其他用於處理邏輯的類。

UI / View可以了解業務,Business可以了解數據訪問,但是反之則不行。 這樣,您將不會得到循環依賴,也不會糾纏代碼。

我希望這對您有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM