在自定义模型绑定器中访问数据存储区的正确方法是什么?

时间:2010-04-11 20:09:13

标签: asp.net-mvc dependency-injection inversion-of-control modelbinders

如何在自定义模型绑定器中正确实现数据访问?

与控制器类似,我使用IContentRepository然后让它在构造函数中创建其实现类的实例。所以我已准备好在稍后阶段整合IoC(DI)。

现在我需要在模型绑定器中使用类似的东西。我需要在活页夹中进行一些数据库查找。我正在考虑像在控制器中那样做,但我愿意接受建议。

这是我的一个控制器的片段,所以你可以想象我是如何做到的:

        public class WidgetZoneController : BaseController
        {
// BaseController has IContentRepository ContentRepository field
            public WidgetZoneController() : this(new XmlWidgetZoneRepository())
            {
            }

            public WidgetZoneController(IContentRepository repository)
            {
                ContentRepository = repository;
            }
    ...

2 个答案:

答案 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())。因此,请确保您的存储库在两种情况下均有效。