使用Sharp Architecture注册自定义模型绑定器

时间:2011-04-23 21:58:02

标签: asp.net-mvc asp.net-mvc-3 s#arp-architecture

我是MVC(我使用的是第3版)和Sharp Architecture的新手,我无法弄清楚如何使用自定义模型装订器。

我有一个名为Teacher的域对象(不是视图模型),以及以标准Sharp Architecture方式完成的存储库ITeacherRepository。我注册了这条路线:

            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 个答案:

答案 0 :(得分:10)

注册的一种方法是在Global.asax

中的Application_Start方法中添加以下行
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())));

答案 1 :(得分:0)

我不熟悉S#arp架构在这种情况下提供的内容,但您可以这样做:http://iridescence.no/post/Constructor-Injection-for-ASPNET-MVC-Model-Binders.aspx

然后您只需在容器中注册所有活页夹,并在asp.net mvc中将此新的活页夹解析器注册为默认模型活页夹。