我是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));
我没有看到等效的模型构建工厂。
答案 0 :(得分:10)
注册的一种方法是在Global.asax
中的Application_Start方法中添加以下行ModelBinders.Binders.Add(typeof(Teacher), new TeacherModelBinder());
要通过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中将此新的活页夹解析器注册为默认模型活页夹。