ASP.NET MVC: BLL и DAL для проектирования хранилища - PullRequest
4 голосов
/ 08 февраля 2011

Мы переходим с веб-форм ASP.NET на MVC 2.0.В большинстве наших проектов у нас есть типичная установка для связи с базой данных.

Common (объекты / сущности, такие как 'SiteMenu' и 'Users')

Уровень бизнес-логики (с вызовами на уровень доступа к данным)

Уровень доступа к данным

DAL имеет компонент DatabaseHelper с общей операцией базы данных, OdbcHelper сспецифичные для базы данных операции (например, MySQL) и класс StoredProcedure со всеми хранимыми процедурами.

Как этот дизайн переводится в проект репозитория?Мы хотим использовать наших собственных помощников по базам данных вместо NHibernate и т. Д.

Что бы вы предложили?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Вы можете использовать репозитории, используя любую технологию доступа к данным. Репозиторий является абстракцией существующих помощников / служб доступа к данным, позволяя отделить бизнес-логику от уровня доступа к данным. Хранилища используются вместе с Query для включения фильтрации. Он часто используется вместе с единицей работы для сохранения изменений в базе данных.

Хранилище имеет как минимум:

  1. Операции получения объекта по ключу
  2. Операция получения всех объектов
  3. Операции получения первого объекта по запросу
  4. Операции получения объектов по запросу

Очень простой пример:):

A. Продукт класс, определенный в Common :

public class Product
{
    public int Id { get; private set; }

    public string Code { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set; }
}

B. Классы для Query , IRepository и IUnitOfWork определены в DAL.interfaces.dll или Common.dll ( но НЕ в DAL !).

public class Query
{
    public string Text { get; set; }
}

public interface IRepository<TEntity>
    where TEntity : class
{
    bool TryGet(int key, out TEntity value);

    TEntity this[int key] { get; }

    IEnumerable<TEntity> GetAll();

    bool TryGetFirst(Query condition, out TEntity value);

    TEntity GetFirst(Query condition);

    IEnumerable<TEntity> GetAll(Query condition);

    int Count { get; }
}


public interface IUnitOfWork
{
    void SetAdded(TEntity value); // Marks entity as added for further INSERT

    void SetRemoved(TEntity value); // Marks entity as removed for further DELETE

    void SetChanged(TEntity value); // Marks entity as modified for further UPDATE

    void Save(); // Save all the changes 
}

IUnitOfWork знает об измененных объектах. Save () вызывает соответствующий CRUD-метод DatabaseHelper / OdbcHelper для каждого измененного объекта, чтобы сохранить изменения в базе данных.

Реализация IRepository , ... IRepository и IUnitOFWork должна быть помещена в DAL. Затем BLL использует IRepository и IUnitOFWork для реализации бизнес-логики (домена). Сам BLL может быть организован как уровень обслуживания поверх модели домена , но это выходит за рамки обсуждения:).

Надеюсь, мой ответ поможет.

Пожалуйста, не стесняйтесь задавать мне вопрос ...

Ссылки: Шаблоны архитектуры приложения для бизнеса от Мартина Фаулера

1 голос
/ 08 февраля 2011

Вы можете сохранить тот же многоуровневый подход при переходе на MVC.Ваш BLL, который возвращает сущности / объекты, может быть вашим M в MVC.Часто в примерах вы увидите, что люди создают экземпляр хранилища непосредственно в своем контроллере, в вашем случае вы будете создавать экземпляр вашего класса BLL.

...