如何将数据服务绑定到 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();

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

感觉好像少了什么...

更新

我想我可能已经想通了。我在控制器中添加了 IDetailsS​​ervice,它似乎成功地拉取了查询。

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

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

是的,这就是答案!

  1. 创建服务
  2. 将会话绑定到服务
  3. 向控制器添加服务。
  4. 必要时致电服务部。

一如既往,只是有些事情被忽略了!