Я изначально проектировал свою систему, следуя примеру архитектуры s # , описанному в этой статье codeproject (К сожалению, я не использую NHibernate). Основная идея заключается в том, что для каждого объекта домена, который должен был бы взаимодействовать со слоем постоянства, у вас должен быть соответствующий объект доступа к данным в другой библиотеке. Каждый объект доступа к данным реализует интерфейс, и, когда объекту домена требуется доступ к методу доступа к данным, он всегда кодирует для интерфейса, а не для самих DAO.
В то время и до сих пор я думал, что этот дизайн очень гибкий. Однако, поскольку количество объектов в моей доменной модели выросло, я задаюсь вопросом, нет ли здесь организационной проблемы. Например, почти каждый объект в домене заканчивается соответствующим интерфейсом объекта доступа к данным и объекта доступа к данным. Не только это, но каждый из них находится в другом месте, которое труднее поддерживать, если я хочу сделать что-то простое, например, переместиться в некоторые пространства имен.
Интересно, что многие из этих DAO (и их соответствующие интерфейсы) являются очень простыми существами - самый распространенный имеет только один метод GetById (). Я получаю целую кучу объектов, таких как
public interface ICustomerDao {
Customer GetById(int id);
}
public interface IProductDao {
Product GetById(int id);
}
public interface IAutomaticWeaselDao {
AutomaticWeasel GetById(int id);
}
Там, где их разработчики обычно тоже очень просты. Это заставляет меня задуматься, не будет ли проще пойти в другом направлении, возможно, поменять мою стратегию, имея один объект для простых задач доступа к данным, и зарезервировав создание выделенных объектов доступа к данным для тех, кому нужно что-то еще сложный.
public interface SimpleObjectRepository {
Customer GetCustomerById(int id);
Product GetProductById(int id);
AutomaticWeasel GetAutomaticWeaselById(int id);
Transaction GetTransactioinById(int id);
}
public interface TransactionDao {
Transaction[] GetAllCurrentlyOngoingTransactionsInitiatedByASweatyGuyNamedCarl();
}
Кто-нибудь имеет опыт работы с такой архитектурой? В целом, я очень доволен настройкой, так как теперь моей единственной заботой является управление всеми этими небольшими файлами. Однако мне все еще интересно, какие существуют другие подходы к структурированию уровня доступа к данным.