仅通过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)
{
}
}
视图模型根本不应该有依赖关系。将存储库注入控制器并从中分配值。
此外,如果许多页面使用相同的基本视图模型,这表明页面的某些部分在许多情况下甚至一直显示。在这种情况下,最好为该区域提供一个自定义控制器和视图,并使用Html.RenderAction
来渲染该部分。
我仍然坚持我之前的评论:你必须重新思考你的类层次结构,这不是你应该用Ninject解决的问题。
如果基类接受存储库,那么所有派生类也应该接受。然而,作为一种替代方案,您可以将一个特殊的NullRepository
注入到VideoPageViewModel
中,它基本上什么都不做(请参阅空对象模式)
使用Ninject:中的WhenInjectedInto()
可以实现按目标类型的绑定
kernel.Bind<IHtmlPageRepository>()
.To<HtmlPageRepository>()
.WhenInjectedInto<HtmlPageModel>();
kernel.Bind<IHtmlPageRepository>()
.To<NullRepository>()
.WhenInjectedInto<VideoPageViewModel>();
这与brokenGlass的答案基本相同。为什么不创建另一个基类,并将属性/功能从当前基类移动到该基类中,但不移动与存储库相关的构造函数/功能呢。