Я новичок в Asp.Net MVC и хочу разделить свой проект на многоуровневую архитектуру, имея
1- Проект MVC (уровень пользовательского интерфейса уровня представления)
2- Уровень бизнес-логики BLL (здесь я хочу проверить данные View Model и преобразовать View Model в Database Model с помощью автоматического сопоставления, а затем отправить обратно View Model путем преобразования обратно с использованием автоматического сопоставления в слой пользовательского интерфейса (проект MVC)
3- Уровень доступа к данным, имеющий хранилище БД, контекст и т. Д., На который я хочу ссылаться только на бизнес-уровне.
Я путаюсь между уровнем бизнес-логики и уровнем MVC Project (UI). Мои классы модели представлений находятся в папке Model внутри проекта MVC, а уровень бизнес-логики имеет ссылку на уровень доступа к данным, имеющий классы таблиц базы данных. поэтому моя модель представления не распознается на уровне бизнес-логики. если я хочу добавить MVC-проект (где существует моя модель представления) со ссылкой на уровень бизнес-логики, он выдаст ошибку циклических зависимостей. Я много искал на форумах и в учебных пособиях, но не смог найти решения или не понял концепции.
мой уровень бизнес-логики и уровень доступа к данным - это проект библиотеки, а уровень пользовательского интерфейса - проект 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);
}
}
}
Я хочу использовать этот класс в слое бизнес-логики, а не в контроллере. вот мое заблуждение, как написать слой бизнес-логики и использовать auto mapper в уровне бизнес-логики с ошибкой циклических зависимостей