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

本文关键字:绑定 基类 存储 Ninject | 更新日期: 2023-09-27 18:21:04

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

public class HtmlPageModel
{
        private readonly IHtmlPageRepository _repository;
        public HtmlPageModel (IHtmlPageRepository repository)
        {
            _repository = repository;
        }
}

public class VideoPageViewModel : HtmlPageModel 
{
        public VideoPageViewModel(IHtmlPageRepository repository) : base(repository)
        {
        }
    }

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

视图模型根本不应该有依赖关系。将存储库注入控制器并从中分配值。

此外,如果许多页面使用相同的基本视图模型,这表明页面的某些部分在许多情况下甚至一直显示。在这种情况下,最好为该区域提供一个自定义控制器和视图,并使用Html.RenderAction来渲染该部分。

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

如果基类接受存储库,那么所有派生类也应该接受。然而,作为一种替代方案,您可以将一个特殊的NullRepository注入到VideoPageViewModel中,它基本上什么都不做(请参阅空对象模式)

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

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

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