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

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


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

        }

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


MMTTMM
浏览 118回答 1
1回答

梦里花落0921

ViewModels 不应该是业务逻辑层的一部分,因为它们纯粹是为了展示。你现在如何组织它使得业务需要 UI/View,这需要业务开始,这需要 UI/View 开始(重复...)UI/View 可能知道业务层,但反过来就不知道了。因此,执行此操作的“正确”方法是首先将您的数据库信息映射到一个普通的旧 C# 对象,您的 UI 层可能会通过业务层请求该对象。之后,UI 层可能会通过将其转换为经过优化以显示该信息的类 ViewModel 来完成其工作。这并不意味着您必须在控制器内部执行此操作,您可以在 UI/View 项目中添加其他类来处理逻辑。UI/View 可以了解业务,业务可以了解数据访问,但绝不会反过来。这样你就不会得到循环依赖并且没有纠缠的代码。我希望这对你有意义。
打开App,查看更多内容
随时随地看视频慕课网APP