2011-04-23 49 views
4

我是新來的MVC(我使用ver.3)和夏普體系結構,我無法弄清楚如何使用自定義模型聯編程序。註冊夏普體系結構的自定義模型聯編程序

我有一個名爲Teacher的域對象(不是視圖模型),以及以標準的夏普體系結構方式完成的存儲庫ITeacherRepository。我註冊這個路線:

  routes.MapRoute(
      "Teacher", 
      "Teacher/{tid}/{action}", 
      new { controller = "Teacher", action = "Index" }); 

TeacherControllerIndex方法是這樣的:

 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; 
    } 
} 

現在我卡住了。我如何在夏普架構項目中正確註冊?我假設我也必須將其插入Castle Windsor配置中。我是否也應該有一個接口ITeacherBinder,並在Windsor註冊?

編輯

爲了澄清我的問題:我無法弄清楚如何註冊我的模型綁定,這樣的MVC框架將通過溫莎實例化,並因此採取傳遞所需的構造函數參數的照顧。控制器是由溫莎實例化,這是在global.asax.cs迷上了這一行:

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container)); 

我沒有看到的等效模型生成器工廠。

回答

10

一種註冊方法是通過在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添加下面線在Application_Start方法中描述了這樣做的不同的方式。

要通過溫莎城堡做的,你可以在下面的代碼添加到ComponentRegistrar.cs(位於CastleWindsor文件夾)

container.Register(AllTypes.Of() .FromAssembly(typeof運算(TeacherBinder).Assembly) 。配置(c => c.LifeStyle.Singleton.Named( c.Implementation.Name.ToLower())));

+0

該鏈接就是我正在尋找的。謝謝。 – 2011-05-10 00:34:21

相關問題