Модель должна быть основой всего. Он не ссылается ни на что, другие слои ссылаются на него.
Вопрос 1: Это верно?
Типичный способ обеспечить разделение между моделью предметной области и системой персистентности - определить репозитории. Однако постоянство не является частью модели предметной области.
Ваши модели должны вызывать методы, определенные в хранилище
Например, рассмотрим этот полностью поддельный репозиторий:
// Repository
public class SharepointRepository
{
void SaveWidget(); // Implement
}
Таким образом, хранилище занимается только загрузкой и сохранением данных, они вообще не содержат никакой логики вашего домена.
Однако, если ваша модель тесно связана с хранилищем, у вас возникает проблема разделения проблем.
Так что в этом случае инъекция зависимости становится полезной. В предыдущем примере ваша модель должна была бы явно создать экземпляр SharePointRepository и вызвать методы. Более чистый способ сделать это, чтобы вашей модели было все равно, - ввести зависимость вашего хранилища во время выполнения.
namespace YourApp.Domain.Abstract
{
public interface ISharePointRepository
{
void SaveWidget();
}
}
На основе этого интерфейса вы можете создать конкретную реализацию и внедрить зависимость от конкретной реализации во время выполнения.
namespace YourApp.Domain.Concrete
{
public class SqlSharePointRepository : ISharePointRepository
{
void SaveWidget()
{
// Code that Saves the widget using the managed sql provider
}
}
}
Итак, на вашей веб-форме:
Когда вы собираете данные, ваша модель будет гидратирована данными из формы и будет вызывать метод репозитория, однако сам репозиторий мог бы быть внедрен в приложение asp.net во время выполнения, поэтому вы можете изменить SqlSharePointRepository на RavenDbRepository, не ломая ваше приложение.
Чтобы узнать, как связать ваш репозиторий в Webforms, смотрите это сообщение SO: Как я могу реализовать Ninject или DI на веб-формах asp.net?
С MVC контроллер отвечает за разрыв, который, по вашему мнению, вы испытываете. Но что касается ваших вопросов и в зависимости от вашего текущего дизайна, модель должна вызывать операции с хранилищем, однако само хранилище должно быть слабо связанным.