仅通过Ninject将存储库绑定到基类?

时间:2012-01-19 21:47:12

标签: c# asp.net-mvc-3 ninject

我有一个基类,它有一个注入构造函数的存储库,现在我从它派生的任何类现在也需要这些参数,但是存储库只用于基类,有没有办法绑定Ninject只是基类而不是通过构造函数?最重要的是,这是一个好主意吗?

public class HtmlPageModel
{

        private readonly IHtmlPageRepository _repository;

        public HtmlPageModel (IHtmlPageRepository repository)
        {
            _repository = repository;

        }
}


public class VideoPageViewModel : HtmlPageModel 
{

        public VideoPageViewModel(IHtmlPageRepository repository) : base(repository)
        {

        }
    }

3 个答案:

答案 0 :(得分:4)

视图模型根本不应具有依赖性。将存储库注入控制器并从那里分配值。

此外,如果许多页面使用相同的基本视图模型,则表示页面的某些部分在很多情况下或甚至所有时间都显示。在这种情况下,最好为此区域设置自定义控制器和视图,并使用Html.RenderAction呈现此部分。

答案 1 :(得分:2)

我仍然坚持我之前的评论:你必须重新考虑你的类层次结构,这不是你应该使用Ninject解决的问题。

如果您的基类接受存储库,那么所有派生类也应如此。作为替代方案,您可以在NullRepository注入一个特别VideoPageViewModel,但基本上什么都不做(参见Null Object pattern

可以使用Ninject中的WhenInjectedInto()来实现目标类型的绑定:

kernel.Bind<IHtmlPageRepository>()
      .To<HtmlPageRepository>()
      .WhenInjectedInto<HtmlPageModel>();

kernel.Bind<IHtmlPageRepository>()
      .To<NullRepository>()
      .WhenInjectedInto<VideoPageViewModel>();

答案 2 :(得分:0)

这与brokenGlass的答案基本相同。为什么不创建另一个基类,并将属性/功能从当前基类移动到那个基类中,但不要移动与存储库相关的构造函数/功能。