如何在自定义模型绑定器中正确实现数据访问?
与控制器类似,我使用IContentRepository然后让它在构造函数中创建其实现类的实例。所以我已准备好在稍后阶段整合IoC(DI)。
现在我需要在模型绑定器中使用类似的东西。我需要在活页夹中进行一些数据库查找。我正在考虑像在控制器中那样做,但我愿意接受建议。
这是我的一个控制器的片段,所以你可以想象我是如何做到的:
public class WidgetZoneController : BaseController
{
// BaseController has IContentRepository ContentRepository field
public WidgetZoneController() : this(new XmlWidgetZoneRepository())
{
}
public WidgetZoneController(IContentRepository repository)
{
ContentRepository = repository;
}
...
答案 0 :(得分:0)
由于绑定器通常绑定实体,因此您不需要像IContentRepository
这样的特定存储库,实际上IRepository<T>
可以很好地获取实体。
要实例化IRipository,你可以使用类似的东西:
var repositoryType = typeof (IRepository<>).MakeGenericType(entityType);
我建议你看一下实体binder的CodeCampServer实现,在这里:
http://code.google.com/p/codecampserver/source/browse/trunk#trunk/src/UI/Binders/Entities
答案 1 :(得分:0)
您可以将构造函数注入用于自定义模型绑定器类,也可以从DefaultModelBinder继承。
public class MyModelBinder : DefaultModelBinder
{
IContentRepository ContentRepository;
public MyModelBinder(IContentRepository contentRepository)
{
this.ContentRepository = contentRepository;
}
使用自定义模型绑定器,您可以在Application_Start()中注册它们,如下所示:
protected void Application_Start()
{
System.Web.Mvc.ModelBinders.Binders.Add(
typeof(MyModel), new MyModelBinder(contentRepository)
);
现在使用IoC时,您需要记住对象的生命周期。当您将IoC与控制器一起使用时,它们存在于每个Web请求中。因此,如果您注入存储库,任何数据连接或OR / M会话将仅存在这么短的时间。
使用Model Binder,它基本上是一个长寿命的Singleton(Application_Start())。因此,请确保您的存储库在两种情况下均有效。