[英]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.