Я работал над NerdDinner Tutorial, и большая часть его имеет смысл. В чем я не уверен, так это в том, почему хранилище используется непосредственно в контроллере, а не в объектах модели. Например, если мы хотим внедрить нашу собственную систему членства и в ней есть AccountController с методом Login, что будет лучшим решением для его подключения? например,
Login(username,password){
repo = AccountRepository
account = repo.getLogin(username,password)
//check account isn't locked
//check account has been verified etc etc
//throw error or proceed to secure area
}
OR
Login(username,password){
repo = AccountRepository
account = repo.getLogin(username,password)
account.login() //business logic is handled in Account (Model)
}
OR
Login(username,password){
//no reference to repository
account = Account
//Account (Model) uses repository and handles business logic
account.login(username,password)
}
Я предлагаю, чтобы объект Account использовал прямое использование AccountRepository вместо того, чтобы AccountController получал информацию из AccountRepository и затем передавал ее объекту Account, например
Стиль NerdDinnner:
1 Запрос на вход приходит
2 AccountController использует AccountRepository для получения данных для входа в систему на основании запроса
3 AccountController использует объект Account и передает информацию с шага 1
4 Объект Account обрабатывает запрос и уведомляет AccountController
Что я предлагаю:
1 Запрос на вход в систему приходит
2 AccountController использует объект Account для обработки входа в систему по запросу
3 Объект Account использует AccountRepository для получения данных для входа в систему
4 Объект Account обрабатывает запрос и уведомляет AccountController
Причиной последнего стиля является то, что после того, как данные для входа возвращаются из AccountRepository, должны соблюдаться бизнес-правила, например, заблокирован ли аккаунт, верифицирован ли аккаунт и т. д. Если в первом стиле используется логика для получения деталей, а затем их использование разбивается на 2 этапа. Последний стиль объединяет всю логику, все еще используя AccountRepository, например,
Account.Login(username,password){
repo = AccountRepository
account = repo.GetLogin(username,password)
//check account isn't locked
//check account has been verified etc etc
//throw error or proceed to secure area
}
Надеюсь, это имеет смысл.