2010-06-24 5 views
0

Я использую Ninject для выполнения инъекции зависимостей. (В основном для ДАЛ), мой проект состоит из 3-й аспектов и является,ASP.Net MVC, Ninject IOC

  1. Project.Lib (всех баз данных, услуги и anythign еще, что логики)
  2. Project.Admin (Администрация)
  3. Project.Web (передний конец, что посмотреть пользователь в)

Теперь каждый из моих контроллеров в рамках моих проектов наследовать от BaseController

public abstract class BaseController : Controller 
    { 
     protected BaseController(ISession session) 
     { 
      _Session = session; 
     } 

     public ISession _Session { get; private set; } 
    } 

А потом и пример контроллера может быть, как это так,

public class ImageController : BaseController 
    { 
     private MediaService _mediaService; 

     public ImageController(ISession session) : base(session) 
     { 
      _mediaService = new MediaService(session); 
     } 

     [HttpGet] 
     public ActionResult List() 
     { 
      var RetVal = _mediaService.GetAllImages(); 
      return View(RetVal); 
     } 
} 

Как вы можете видеть «Session» передается от контроллера на уровне услуг. Мне любопытно, хорошо ли это? ЛЮБЫЕ негативы тому, что мы здесь делаем?

ответ

2

Я бы не стал ссылаться на ISession через ваш контроллер. Лучшим решением будет использование Ninject для внедрения ваших услуг в ваши контроллеры. В этом случае вам необходимо создать абстракцию для MediaService класса, например:

public interface IMediaService 
{ 
    SomeCollection GetAllImages(); 
    // ... 
} 

Вы бы затем использовать Ninject поставить реализацию вышеуказанного интерфейса к контроллеру:

public class ImageController : BaseController 
{ 
    private IMediaService _mediaService; 

    public ImageController(IMediaService mediaService) 
    { 
     _mediaService = mediaService 
    } 

    [HttpGet] 
    public ActionResult List() 
    { 
     var RetVal = _mediaService.GetAllImages(); 
     return View(RetVal); 
    } 

}

+0

Но есть ли почти 12 классов обслуживания? Мы не могли вводить их все в каждый контроллер? – LiamB

+0

Технически нет причин, по которым вы не смогли бы, и это устранило бы зависимости между вашими контроллерами и службами, что упростило бы модульный тест. Сказав это, если у вас есть контроллер с множеством зависимостей, это может быть признаком того, что дизайн вашего приложения не масштабируется, или вам нужно переложить какую-то ответственность на другой контроллер. – richeym

+0

каждый контроллер обычно использует только 1 (в некоторых случаях 2) услуги. Может быть, я неправильно интерпретировал то, что вы на самом деле имели в виду? – LiamB

Смежные вопросы