我有一个基类,它有一个注入构造函数的存储库,现在我从它派生的任何类现在也需要这些参数,但是存储库只用于基类,有没有办法绑定Ninject只是基类而不是通过构造函数?最重要的是,这是一个好主意吗?
public class HtmlPageModel
{
private readonly IHtmlPageRepository _repository;
public HtmlPageModel (IHtmlPageRepository repository)
{
_repository = repository;
}
}
public class VideoPageViewModel : HtmlPageModel
{
public VideoPageViewModel(IHtmlPageRepository repository) : base(repository)
{
}
}
答案 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的答案基本相同。为什么不创建另一个基类,并将属性/功能从当前基类移动到那个基类中,但不要移动与存储库相关的构造函数/功能。