如何将数据服务绑定到 Ninject 中的另一个服务 class?
How to bind data service to another service class in Ninject?
我正在为我的网站创建一个显示产品所有信息的视图。我想创建一个 "Details" 服务 class 来处理我的大部分查询。
我将会话绑定到 GeneralWebApplicationDataNinjectModule 中的数据:
Bind<IContentService>().To<ContentService>().InRequestScope();
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession()
)
.WhenInjectedInto<IContentService>()
.InRequestScope();
我有一个 ContentService class 可以提取我的所有数据,如下所示:
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);
}
所以我创建了一个新服务 class 来提取尝试使用 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,它似乎成功地拉取了查询。
private static IContentService _contentService;
// new
private static IDetailsService _detailsService;
public MobileController(IContentService contentService, IDetailsService detailsService)
{
_contentService = contentService;
//new
_detailsService = detailsService;
}
是的,这就是答案!
- 创建服务
- 将会话绑定到服务
- 向控制器添加服务。
- 必要时致电服务部。
一如既往,只是有些事情被忽略了!
我正在为我的网站创建一个显示产品所有信息的视图。我想创建一个 "Details" 服务 class 来处理我的大部分查询。 我将会话绑定到 GeneralWebApplicationDataNinjectModule 中的数据:
Bind<IContentService>().To<ContentService>().InRequestScope();
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession()
)
.WhenInjectedInto<IContentService>()
.InRequestScope();
我有一个 ContentService class 可以提取我的所有数据,如下所示:
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);
}
所以我创建了一个新服务 class 来提取尝试使用 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,它似乎成功地拉取了查询。
private static IContentService _contentService;
// new
private static IDetailsService _detailsService;
public MobileController(IContentService contentService, IDetailsService detailsService)
{
_contentService = contentService;
//new
_detailsService = detailsService;
}
是的,这就是答案!
- 创建服务
- 将会话绑定到服务
- 向控制器添加服务。
- 必要时致电服务部。
一如既往,只是有些事情被忽略了!