如何将数据服务绑定到Ninject中的另一个服务类?

时间:2015-12-22 15:29:03

标签: c# nhibernate lambda ninject.web.mvc

我正在创建一个视图,显示我网站上产品的所有信息。我想创建一个"详细信息"服务类,处理我的大部分查询。 我将会话绑定到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();

我得到很多错误,它希望我在DetailsS​​ervice中实现ContentService中的所有内容,但我不想复制它。我只想使用ContentService在DetailsS​​ervice中找到的内容。就像控制器如何轻松实现它一样。

我觉得我有些失踪...

更新

我想我可能已经想出了什么。我将IDetailsS​​ervice添加到Controller,它似乎成功地提取了查询。

 private static IContentService _contentService;
 // new
private static IDetailsService _detailsService;

    public MobileController(IContentService contentService, IDetailsService detailsService)
    {
        _contentService = contentService;
        //new
        _detailsService = detailsService;
    }

1 个答案:

答案 0 :(得分:1)

是的,这就是答案!

  1. 创建服务
  2. 将会话绑定到服务
  3. 向控制器添加服务。
  4. 必要时致电服务部门。
  5. 一如既往,只是忽视了一些事情!