ASP.NET MVC自定义模型绑定器和过滤器内的依赖注入

时间:2010-06-29 22:48:49

标签: c# asp.net-mvc ninject

这是我对BaseContentObject类的自定义模型绑定器代码:

public class BaseContentObjectCommonPropertiesBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext);
        IContentRepository repository = new XmlContentRepository(obj.ContentType);

        // do something with the object and repository here...

        return obj;
    }
}
为了清楚起见,我遗漏了一些代码。

这条线让我感兴趣。

IContentRepository repository = new XmlContentRepository(obj.ContentType);

我已经为依赖注入设置了所有内容,它可以与我的控制器一起使用。我正在使用Ninject 2。 不知何故,我需要在这个模型绑定器中连接DI(我也有类似的MVC操作过滤器问题) - 在自定义绑定器和自定义操作过滤器中我有时需要访问存储库或服务,因为我必须访问数据库。

更糟糕的是,内容存储库不是固定的,而是依赖于“obj.ContentType”。

到目前为止我发现的所有内容都指向Ninject文档,但它的wiki只显示了非常基本的示例,并且看起来还没有更新到版本2。

2 个答案:

答案 0 :(得分:2)

该项目声称能够将依赖项注入ModelBinder http://mvcextensions.codeplex.com/。它由Telerik的Kazi Manzur Ra​​shid完成。

答案 1 :(得分:0)

如果我正确理解了这个问题,你想把repository变成一个属性,然后在构造函数中用Inject作为一个调用Ninject Kernel的this方法参数。

如果您使用[Inject]属性来识别应该注入的属性,请在此处使用它。如果您正在使用自动绑定,则创建Module IContentRepository,其类型XmlContentRepository的Autobinds属性为ContentType的构造函数。

现在你要解决的唯一问题是将ContentType传递给Repository,因为你的构造函数没有访问权限。也许是IContentRepository上的{{1}}属性?

[编辑]所有这一切,我不会不同意你可能应该从DI找到不同方法的论点。我只是在解释它是如何完成的,如果你真的想要的话。