Зарегистрируйте пользовательский переплет модели в Sharp Architecture - PullRequest
4 голосов
/ 24 апреля 2011

Я новичок в 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));

Я не вижу аналогичной фабрики по сборке моделей.

Ответы [ 2 ]

10 голосов
/ 25 апреля 2011

Один из способов зарегистрироваться - добавить строку ниже в методе Application_Start в Global.asax

ModelBinders.Binders.Add(typeof(Teacher), new TeacherModelBinder());

Это http://www.dominicpettifer.co.uk/Blog/39/dependency-injection-in-asp-net-mvc-2---part-2--modelbinders-viewmodels описывает другой способ сделать это.

Чтобы сделать это через Castle Windsor, вы можете добавить приведенный ниже код в ComponentRegistrar.cs (находится в папке CastleWindsor)

container.Register (AllTypes.Of () .FromAssembly (TypeOf (TeacherBinder) .assembly) .Configure (c => c.LifeStyle.Singleton.Named ( c.Implementation.Name.ToLower ())));

0 голосов
/ 26 апреля 2011

Я не знаком с тем, что обеспечивает архитектура S # arp в этом случае, но вы можете сделать что-то вроде этого: http://iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Model-Binders.aspx.

Затем вы просто регистрируете все свои связующие в контейнере и регистрируете этот новыйраспознаватель связывателей в качестве связывателя модели по умолчанию в asp.net mvc.

...