我正在创建一个视图,显示我网站上产品的所有信息。我想创建一个"详细信息"服务类,处理我的大部分查询。 我将会话绑定到GeneralWebApplicationDataNinjectModule中的数据:
Bind<IContentService>().To<ContentService>().InRequestScope();
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession()
)
.WhenInjectedInto<IContentService>()
.InRequestScope();
我有一个ContentService类,可以将我的所有数据拉出来,如下所示:
public interface IContentService
{
IQueryable<Program> Programs { get; }
}
public class ContentService : IContentService
{
private readonly ISession _session;
public ContentService(ISession session)
{
_session = session;
}
public IQueryable<Program> Programs
{
get { return _session.Query<Program>(); }
}
}
...当我将它加载到我的控制器中时,这个工作正常:
public class ProgramController : Controller
{
private static IContentService _contentService;
public ProgramController (IContentService contentService)
{
_contentService = contentService;
}
public ActionResult Details(string item)
{
var ProgramDetails = DetailsService.ProgramsFind();
//this is where i want to use the service class to pull data in DetailsService.
var model = new DetailPageViewModel
{
ProgramTables = GetUpComingCourses(),
};
return View("../Shared/DetailView", model);
}
所以我创建了一个新的服务类来提取尝试使用ContentService的细节:
public class DetailsService
{
private static IContentService _contentService;
public DetailsService(IContentService contentService)
{
_contentService = contentService;
}
public static IEnumerable<Programs> ProgramsFind()
{
var results =
_contentService
.Programs
.Where(
d => d.TypeId >= 16 || d.TypeId <= 18);
return results;
}
我得到一个 System.NullReferenceException未被用户代码处理,Message = Object引用未设置为ProgramsFind()中调用_contentService的行上的对象实例。当我调试它说它 null 。
所以我意识到这是因为数据没有绑定到详细信息服务。当我输入我的InjectionDependency时:
Bind<IContentService>().To<DetailsService>().InRequestScope();
我得到很多错误,它希望我在DetailsService中实现ContentService中的所有内容,但我不想复制它。我只想使用ContentService在DetailsService中找到的内容。就像控制器如何轻松实现它一样。
我觉得我有些失踪...
更新
我想我可能已经想出了什么。我将IDetailsService添加到Controller,它似乎成功地提取了查询。
private static IContentService _contentService;
// new
private static IDetailsService _detailsService;
public MobileController(IContentService contentService, IDetailsService detailsService)
{
_contentService = contentService;
//new
_detailsService = detailsService;
}
答案 0 :(得分:1)
是的,这就是答案!
一如既往,只是忽视了一些事情!