2015-12-22 6 views
1

Я создаю представление, отображающее всю информацию о продукте для моего сайта. Я хочу создать класс обслуживания «Подробности», который обрабатывает большинство моих запросов. я переплетен своей сессия моих данных в GeneralWebApplicationDataNinjectModule:Как связать службу данных с другим классом обслуживания в Ninject?

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 = ссылка на объект не указывает на экземпляр объекта на линии в ProgramsFind(), где им вызова _contentService. Когда я отлаживаю то, что он говорит свой null.

Итак, я понял, что это связано с тем, что данные не привязаны к службе сведений. Когда я вхожу в моем InjectionDependency это:

Bind<IContentService>().To<DetailsService>().InRequestScope(); 

я получаю много ошибок, где он хочет, чтобы я реализовать все, Thats в ContentService в DetailsService, но я не хочу, чтобы повторить это. я просто хочу использовать контент, который ContentService нашел в моем DetailsService. Очень похоже на то, как контроллер легко это делает.

Я чувствую, что что-то Theres им не хватает ...

UPDATE

я думаю, что я мог бы понял что-то. Я добавил IDetailsService в контроллер и, похоже, успешно вытаскивает запросы.

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

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

ответ

1

Да, это был ответ!

  1. Создать Услуги
  2. Bind Сессии в услужении
  3. Добавить службу к контроллеру.
  4. Звоните в случае необходимости.

Как всегда, что-то не замечается!