Asp.Net MVC 分层架构中的循环依赖

Circular Dependencies in Asp.Net MVC Layerd Architecture

我是 Asp.Net MVC 的新手,想将我的项目拆分为分层架构 1- MVC项目(表示层UI层) 2- 业务逻辑层 BLL(这里我想验证数据视图模型并使用自动映射器将视图模型转换为数据库模型,然后想通过使用自动映射器转换回 ui(MVC 项目)来发回视图模型层 3- 具有存储库 DB 上下文等的数据访问层,我只想在业务层中引用它们。

我的困惑在于业务逻辑层和 MVC 项目 (UI) 层之间。我的视图模型 classes 在 MVC 项目中的模型文件夹中,业务逻辑层引用了具有数据库 table classes 的数据访问层。所以我的视图模型在业务逻辑层中无法识别。如果我想添加 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);
        }
    }
}

我想在业务逻辑层 class 中使用这个,而不是直接在控制器中使用。这是我的困惑如何编写业务逻辑层并在具有循环依赖性错误的业务逻辑层中使用自动映射器

ViewModels 不应该是业务逻辑层的一部分,因为它们纯粹是为了展示。您现在的组织方式使得业务需要 UI/View,这需要业务开始,需要 UI/View 开始(重复...)

UI/View可能知道业务层,反过来就不知道了。因此,'proper' 的方法是首先将您的数据库信息映射到一个普通的旧 C# 对象,您的 UI 层可能会通过业务层请求该对象。之后,UI 层可以通过将其转换为经过优化以显示该信息的 class ViewModel 来完成其工作。这并不意味着您必须在控制器内部执行此操作,您可以在 UI/View 项目中添加其他 classes 来处理逻辑。

UI/View 可以了解业务,业务可以了解数据访问,但绝不会反过来。这样你就不会得到循环依赖并且没有纠缠的代码。

我希望这对你有意义。