У меня небольшая проблема с архитектурой. В моем проекте у меня есть Business Logic Layer (BLL), который содержит все мои бизнес-правила, модели и API OO для интерфейса. Каждый объект имеет статические методы, такие как getById, которые возвращают экземпляр указанного объекта. У каждого объекта также есть такие методы, как save и delete. Это очень простой код OO.
Теперь у меня есть уровень DataAccess (DAL), содержащийся в отдельном пространстве имен, для каждого объекта BLL у меня есть DataClass или "Репозиторий", который выполняет команды getById и save. Таким образом, методы BLL save и getById представляют собой тонкий слой вокруг методов DataClass.
public static NewsItem GetByID(int id)
{
return DataFactory.GetNewsItemRepository().GetNewsItemById(id);
}
Чтобы DataClasses возвращал объекты BLL, они должны знать BLL. поэтому теперь мы имеем:
GUI --- > BLL < ---- > DAL
DataFactory возвращает только объекты, реализующие интерфейс, поэтому я могу скрыть детали реализации, такие как "OracleNewsItemRepository".
Но теперь для того, что меня прослушивало с тех пор, как я начал объектно-ориентированное программирование. В моем текущем решении, BLL и DAL должны знать друг друга. Это круговая зависимость, и лучше избегать круговых зависимостей. Также я хочу показать интерфейсы (и мой DataFactory), а не мои классы. Это можно сделать, поместив слой DAL в отдельную сборку. Это будет иметь смысл. Однако Visual Studio не позволяет двум ассамблям ссылаться друг на друга. Другой вопрос: модификаторы внутреннего доступа С#
Как-то я думаю, что у меня был весь шаблон доступа к данным. Похоже, что я сверлю шаблон ActiveRecord с другими вещами, такими как DataMappers. Я провел много времени на сайте Мартина Фаулерса, но эти шаблоны описываются очень обобщенно и иллюстрируются очень абстрактной диаграммой UML.
Они не решают мою проблему. Возможно, я немного анал, и нет такой вещи, как "идеальный шаблон доступа к данным". И то, что я сейчас делаю, не кажется ужасно неправильным. Но как я делаю сейчас, кажется, что...
Любые идеи?