Я новичок в MVC (я использую версию 3) и Sharp Architecture, и у меня возникают проблемы с выяснением того, как использовать привязку пользовательской модели.
У меня есть объект домена (не модель представления) с именем Teacher
, а хранилище ITeacherRepository
, выполненное стандартным способом Sharp Architecture.Я регистрирую этот маршрут:
routes.MapRoute(
"Teacher",
"Teacher/{tid}/{action}",
new { controller = "Teacher", action = "Index" });
и метод Index
на TeacherController
выглядит следующим образом:
public ActionResult Index(int tid)
{
Teacher t = TeacherRepository.Get(tid);
if (t == null)
throw new InvalidOperationException("No such teacher");
TeacherDisplay display = new TeacherDisplay(t);
return View("Index", display);
}
Все это прекрасно работает.Теперь я хочу сделать следующий шаг и реализовать пользовательское связующее для модели Teacher
, чтобы метод контроллера мог выглядеть следующим образом:
public ActionResult Index(Teacher t)
{
if (t == null)
throw new InvalidOperationException("No such teacher");
TeacherDisplay display = new TeacherDisplay(t);
return View("Index", display);
}
Я написал связующее для примитивной модели:
public class TeacherBinder : SharpArch.Web.ModelBinder.SharpModelBinder
{
private ITeacherRepository teacherRepository = null;
public TeacherBinder(ITeacherRepository repo)
{
this.teacherRepository = repo;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
int tid = (int)bindingContext.ValueProvider.GetValue("tid").ConvertTo(typeof(Int32));
Teacher t = teacherRepository.Get(tid);
return t;
}
}
А теперь я застрял.Как правильно зарегистрировать это в проекте Sharp Architecture?Полагаю, мне нужно подключить это и к конфигурации Castle Windsor.Должен ли я иметь интерфейс ITeacherBinder
и зарегистрировать его в Windsor?
РЕДАКТИРОВАТЬ
Чтобы прояснить мою проблему: я не могу понять, как зарегистрироватьсямой связыватель модели, так что инфраструктура MVC будет создавать его через Windsor и, следовательно, позаботиться о передаче требуемого аргумента конструктора.Контроллеры создаются Windsor, и эта строка подключается в global.asax.cs
:
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));
Я не вижу аналогичной фабрики по сборке моделей.