Передача ModelState конструктора его Сервису с использованием StructureMap - PullRequest
2 голосов
/ 27 февраля 2010

У меня есть этот контроллер

public class AdminController : Controller
{
 private IAdministratorService _administratorService;

 public AdminController(IAdministratorService administratorService)
 {
  _administratorService = administratorService;
 }
}

И у меня есть это:

 private ModelStateDictionary _modelState;

 public AdministratorService(IRepository repository, ModelStateDictionary modelState)
 {
  _repository = repository;
  _modelState = modelState;
 }

Я настроил внедрение зависимостей для контроллеров, чтобы оно загружалось правильно, за исключением отправки ModelState из контейнера. Как ты это делаешь?

Ответы [ 2 ]

0 голосов
/ 18 марта 2010

Вот один из способов решения этой проблемы ...

Контроллер ...

Public Class AdminController
  Inherits System.Web.Mvc.Controller

  Private _adminService as IAdminService

  Public Sub New(adminService as IAdminService)

    _adminService = adminService

    'Initialize the services that use validation...
    _adminService.Initialize(New ModelStateWrapper(Me.ModelState))

  End Sub

  ...

End Class

Service ...

Public Class AdminService
  Implements IAdminService

  Private _repository As IAdminRepository
  Private _dictionary as IValidationDictionary

  Public Sub New(repository as IAdminRepository)

    _repository = repository

  End Sub

  Public Sub Initialize(dictionary As IValidationDictionary) Implements IAdminService.Initialize

    _dictionary = dictionary

  End Sub

  ...

End Class

Интерфейс Wrapper ...

Public Interface IValidationDictionary

  ReadOnly Property IsValid() As Boolean
  Sub AddError(Key as String, errorMessage as String)

End Interface

Реализация оболочки ...

Public Class ModelStateWrapper
  Implements IValidationDictionary

  Private _modelState as ModelStateDictionary

  Public ReadOnly Property IsValid() As Boolean Implements IValidationDictionary.IsValid
    Get
      Return _modelState.IsValid
    End Get
  End Property

  Public Sub New(modelState as ModelStateDictionary)

    _modelState = modelState

  End Sub

  Public Sub AddError(key as string, errorMessage as string) Implements IValidationDictionary.AddError

    _modelState.AddModelError(key, errorMessage)

End Class

Использование ModelStateWrapper позволяет слабо связывать классы обслуживания с MVC. Хотя у нас есть тесная связь между AdminController и ModelStateWrapper из-за оператора New, но мне все равно, потому что состояние модели в любом случае зависит от MVC. При этом вам не нужно будет регистрировать ModelStateWrapper или ModelState в StructureMap.

В своих модульных тестах вы могли вызвать метод Initialize службы после создания контроллера, чтобы передать состояние модели тестирования и проверить ошибки проверки.

Я знаю, что вы сказали, что используете ModelStateWrapper, но просто хотели добавить более полный пример, который может помочь другим ...

0 голосов
/ 27 февраля 2010

Вам действительно следует избегать таких циркулярных ссылок. Ваш класс обслуживания не должен зависеть от контроллера или чего-либо в сборке System.Web.Mvc. Роль контроллера или какого-либо фильтра действий или связывателя модели заключается в манипулировании ModelState в соответствии с событиями, происходящими на уровне обслуживания.

...