2011-02-08 4 views
4

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

Общие (объекты/субъекты, такие как 'SiteMenu' и 'Пользователи')

Business Logic Layer (с вызовами ослабляющих данных Access Layer)

Data Access Layer

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

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

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

ответ

1

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

+0

Мы используем Entities/объект в M (модели), когда мы хотим, чтобы выставить их на вид. В противном случае мы теперь добавим их в отдельную библиотеку классов домена. Но как использовать дизайн репозитория? И где поместить вызовы базы данных (общие и специфичные для базы данных)? Может быть, это просто именование, но наши мысли приветствуются! – jpderooy

+0

Репозиторий - это не что иное, как отличный отклик на ваши классы DAL, которые используют любую используемую технологию баз данных. Я не хочу вдаваться в подробности того, как репозиторий отличается от ваших классов DAL, это простой запрос google. Однако по сути они серверные аналогичные цели. В противном случае вы все равно создадите экземпляр своего класса BLL в своем контроллере, который, в свою очередь, создаст экземпляр репозитория, в конечном итоге вернув сущность, чтобы использовать ее как M в MVC. – e36M3

+0

Привет, это имеет смысл. Я думаю, что разница или сходство в репозитории <> DAL не понятна (даже при поиске в Google). Можете ли вы дать мне дополнительную информацию об установке? Объекты, бизнес-логика и репозиторий, которые взаимодействуют с базой данных? Где - в структуре логических папок и имени - мы помещаем конкретные операции с базой данных, например, db.run()? Благодаря! – jpderooy

3

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

Хранилище имеет, по меньшей мере:

  1. Get-объект-с помощью ключа операции (ов)
  2. Get-все-объекты операции
  3. Get-первый объект-по-запросу операции (с)
  4. Get-объекты-по-запросу операции (ов)

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

А. Продукт класс, определенный в 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 или Общие .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() вызывает соответствующий метод DatabaseHelper/OdbcHelper CRUD для каждого измененного объекта, чтобы сохранить изменения в базе данных.

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

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

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

Ссылки: Patterns of enterpise application architecture by Martin Fowler

+0

Очень хорошее объяснение. –

Смежные вопросы