Вот мои вопросы, а затем я дам вам справку по ним:
Я бы предпочел использовать Метод 2 в качестве дизайна моего приложения, поэтому есть ли способ предоставитьфильтрация, как в методе 1, без введения ссылок на некоммерческий код и без предоставления доступа к модели базы данных в проекте Core?
Как вы справляетесь с повторным использованием кода?Пространства имен для каждого объекта являются чем-то вроде Project.Core.Domain или Project.Core.Services, но если вам кажется странным делать пространство имен чем-то вроде CompanyName.Core.Domain, когда оно не хранится в этом проекте.В настоящее время я копирую файлы исходного кода и переименовываю пространства имен, чтобы справиться с этим, но мне интересно, есть ли организационный способ справиться с этим или что-то еще, о чем я не думал?
Используемые мной технологии:
- ASP.NET MVC 3
- Linq-to-SQL
- StructureMap
- Moq
- MSTest
Метод 1:
Вот как я использовал для настройки своих веб-проектов:
Проект Data будет содержать все репозитории и контексты данных Linq.В репозитории я бы возвратил коллекцию объектов из базы данных, используя IQueryable.
public IQueryable<Document> List()
{
return from d in db.Documents
select d;
}
Это позволило мне настроить фильтры, которые были статическими методами.Они также были сохранены в проекте данных.
public static IQueryable<Document> SortByFCDN(this IQueryable<Document> query)
{
return from d in query
orderby d.ID
select d;
}
На сервисном уровне фильтр можно применять следующим образом.
public IPagedList<Document> ListByFCDN(int page, IConfiguration configuration)
{
return repository.List().SortByFCDN().ToPagedList(page, configuration.PageSize, configuration.ShowRange);
}
Следовательно, хранилище должно предоставлять толькоМетод ListAll, который возвращает все элементы в виде объекта IQueryable, а затем уровень обслуживания определяет, как его отфильтровать, прежде чем возвращать подмножество данных.
Мне нравится этот подход, и он сделал мои репозитории чище, оставляя большую частькод в сервисах.
Метод 2
Вот как я сейчас настраиваю свои веб-проекты:
Использование лукаАрхитектура:
- Ядро: содержит модель бизнес-домена, все интерфейсы для приложения и реализации классов обслуживания.
- Инфраструктура: содержит реализации репозитория, контексты данных Linq и классы отображениядля сопоставления модели базы данных Linq с бизнес-моделью.
Поскольку я отделяю свой бизнес-код от базы данных codНапример, я не хочу добавлять ссылки в проекте Core на такие вещи, как Linq, чтобы получить доступ к IQueryable.Итак, мне пришлось выполнить фильтрацию на уровне хранилища, сопоставить модель базы данных с моделью домена, а затем вернуть коллекцию объектов домена на уровень обслуживания.Это может добавить дополнительные методы в мои репозитории.