C# Asp.Net MVC Layerd体系结构中的循环依赖关系

C# Asp.Net MVC Layerd体系结构中的循环依赖关系,c#,asp.net-mvc,automapper,repository-pattern,C#,Asp.net Mvc,Automapper,Repository Pattern,我是Asp.NETMVC新手,希望将我的项目拆分为layerd架构 1-MVC项目(表示层UI层) 2-业务逻辑层BLL(这里我想验证数据视图模型,并使用auto mapper将视图模型转换为数据库模型,然后使用auto mapper将视图模型转换回ui(MVC项目)层 3-数据访问层,具有存储库DB上下文等,我只想在业务层中引用 我的混淆在业务逻辑层和MVC项目(UI)层之间。我的视图模型类位于MVC项目内的模型文件夹中,业务逻辑层引用了具有数据库表类的数据访问层。因此,我的视图模型在业务逻辑

我是Asp.NETMVC新手,希望将我的项目拆分为layerd架构 1-MVC项目(表示层UI层) 2-业务逻辑层BLL(这里我想验证数据视图模型,并使用auto mapper将视图模型转换为数据库模型,然后使用auto mapper将视图模型转换回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);
        }

        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);
        }
    }
}
namespace DAL.Infrastructure.Contract
{
公共接口IBaseRepository:IDisposable其中T:class
{
IEnumerable GetAll();
IEnumerable FindIEnumerableByExpression(表达式谓词);
T FindFirstOrDefaultByExpression(表达式谓词);
T GetById(对象Id);
T插入(T实体);
T删除(T实体);
无效更新(T实体);
作废保存();
}
}
名称空间.基础设施
{
公共类BaseRepository:IBaseRepository,其中T:class
{
公共pmsenties dbContext=null;
公共DbSet DbSet=null;
公共基本存储库()
{
this.dbContext=new pmsenties();
dbSet=dbContext.Set();
}
公共虚拟IEnumerable GetAll()
{
返回dbSet.AsEnumerable();
}
公共T GetById(对象id)
{
返回此.dbSet.Find(id);
}
public IEnumerable FindIEnumerableByExpression(System.Linq.Expressions.Expression谓词)
{
IEnumerable query=dbSet.Where(谓词).AsEnumerable();
返回查询;
}
公共T FindFirstOrDefaultByExpression(System.Linq.Expressions.Expression谓词)
{
返回this.dbSet.FirstOrDefault(谓词);
}
公共虚拟T插入(T实体)
{
返回dbSet.Add(实体);
}
公共虚拟T删除(T实体)
{
返回dbSet.Remove(实体);
}
公共虚拟无效更新(T实体)
{
dbContext.Entry(entity).State=System.Data.entity.EntityState.Modified;
}
公共作废保存()
{
dbContext.SaveChanges();
}
私有布尔=假;
受保护的虚拟void Dispose(bool disposing)
{
如果(!this.disposed)
{
如果(处置)
{
dbContext.Dispose();
}
}
这是真的;
}
公共空间处置()
{
处置(真实);
总干事(本);
}
}
}

我想在业务逻辑层中使用上述类,而不是在控制器中直接使用。下面是我对如何编写业务逻辑层以及如何在业务逻辑层中使用自动映射器的困惑,因为存在循环依赖错误

ViewModels不应该是业务逻辑层的一部分,因为它们纯粹用于表示。您现在是如何组织它的使业务需要UI/视图,需要业务启动,需要UI/视图启动(重复…)

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

UI/View可以了解业务,业务可以了解数据访问,但决不能反过来。这样你就不会得到循环依赖关系,也不会产生纠缠不清的代码


我希望这对您有意义。

请尝试阅读此答案,它可以帮助您:非常好的解释。但我永远不会从UI层访问数据层,这会导致重复代码和实体上不必要的更改。应该始终涉及业务层,以便统一访问数据和转换。但这只是我的意见。我完全同意,这就是我想说的!添加了一些额外的词来澄清这一点。感谢您向我指出这一点。亲爱的@Roy,有任何教程链接可以实现这一概念。