Круговые зависимости в архитектуре уровня Asp.Net MVC - PullRequest
1 голос
/ 09 апреля 2019

Я новичок в 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 в уровне бизнес-логики с ошибкой циклических зависимостей

1 Ответ

2 голосов
/ 09 апреля 2019

ViewModels не должны быть частью уровня бизнес-логики, так как они предназначены исключительно для представления. То, как вы организовали это сейчас, делает так, что Business НУЖЕН UI / View, для начала которого требуется Business, и для чего требуется UI / View (повторить ...)

Пользовательский интерфейс / представление может знать о бизнес-уровне, но не наоборот. Таким образом, «правильный» способ сделать это - сначала отобразить информацию о вашей базе данных в Plain Old C # Object, которую ваш уровень пользовательского интерфейса может запросить через бизнес-уровень. После этого уровень пользовательского интерфейса может выполнить свою работу, преобразовав его в класс, оптимизированный для отображения этой информации, ViewModel. Это не значит, что вы должны делать это внутри контроллера, вы можете добавить другие классы в свой проект UI / View, которые заботятся о логике.

Пользовательский интерфейс / представление может знать о бизнесе, бизнес может знать о доступе к данным, но никак не наоборот. Таким образом, вы не получите циклические зависимости и запутанный код.

Надеюсь, это имеет смысл для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...