Пара наблюдений:
Не вставляйте зависимости просто для их запроса в конструкторе
Нет причин вводить ITimeProvider в пользователя, чтобы просто вызвать Now
немедленно. Просто вместо этого введите время создания:
public User(DateTime creationTime)
{
this.CreationTime = creationTime;
}
Действительно хорошее эмпирическое правило, связанное с DI, заключается в том, что конструкторы не должны выполнять логику .
Не использовать DI с ModelBinders
ASP.NET MVC ModelBinder - действительно плохое место для DI, особенно потому, что вы не можете использовать Constructor Injection. Единственным оставшимся вариантом является статический анти-шаблон Service Locator .
ModelBinder преобразует данные HTTP GET и POST в строго типизированный объект, но концептуально эти типы не являются объектами домена, но похожи на объекты передачи данных .
Гораздо лучшим решением для ASP.NET MVC является полное отказ от пользовательских ModelBinder и вместо этого явно охватывает , что вы получаете по HTTP-соединению , а не объект полного домена .
Вы можете иметь простой поиск или маппер для извлечения вашего доменного объекта в вашем контроллере:
public ActionResult Create(UserPostModel userPost)
{
User u = this.userRepository.Lookup(userPost);
// ...
}
где this.userRepository
- внедренная зависимость.