4

의존성 삽입 기반 컨트롤러의 설계 패턴 - MVC 3 + Ninject

public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
     return View(rep.Offers.GetAll()); 
    } 

    public ActionResult Sections() 
    { 
     return View(env); 
    } 
} 
모든 컨트롤러에서

이렇게 할 수 있습니다. 이것은 DI 및 IoC에 대한 반 패턴이라고 확신하므로

과 같은 솔루션을 씬화 할 수 있지만이 솔루션을 사용하려면 새로운 전역 변수가 필요한 경우 모든 컨트롤러에 모든 종속성을 삽입하고 모든 생성자를 업데이트해야합니다. (rep와 같은) 또는 basecontroller (man과 같은)를위한 새로운 private 변수.

따라야 할 패턴과 그 이유는 무엇입니까?

편집 questionthis를 찾았지만 여전히 어떤 디자인 패턴을 따라야하는지 이해할 수 없습니다.

+1

따라야 할 디자인 패턴이 있다고 생각하는 이유는 무엇입니까? – bzlm

+0

이유 중 하나만 내 응용 프로그램에서 사용해야합니다. –

답변

0

저는 희박한 해결책으로는 항상 rep, man 및 env를 선언해야한다고 생각하지 않습니다. 기본/선택적 매개 변수를 활용할 수 있습니다.

public BaseController(RepositoryFactory rep = null, ManageRoles man = null, ElementAvailableForUser env = null) 
{ 
    _rep = rep; 
    _man = man; 
    _env = env; 
} 

그럼 당신은 이름을 사용할 수있는 매개 변수 지정 :이 경우에 BaseController이 필요한 것처럼

public class HomeController : BaseController 
{ 
    public HomeController(ManageRoles man) : base(man: man) { } 

    ... 
} 
+0

예,이 경우 IoC가 작동하지 않고 자식 컨트롤러에서 설명되지 않은 경우 "man"결과는 항상 null입니다. –

3

이 보이지 않는다. 나는 이런 식으로 뭔가를 쉽게 (더 쓸만한)가 될 것이라고 생각 :

public class HomeController : Controller 
    { 
     private readonly IRepository<Offers> _repository; 
     private readonly RoleManager _roleManager; 
     private readonly UserManager _userManager; 

     public HomeController(IRepository<Offers> repository, RoleManager roleManager, UserManager userManager) 
     { 
      _repository = repository; 
      _roleManager = roleManager; 
      _userManager = userManager; 
     } 
    } 

그런 다음 각 컨트롤러에 대해 자동으로 그 모든 종속성을 당신의 IoC 컨테이너 선을 가질 수있다.

+0

그래,이 경우가 될 수 있지만 모든 컨트롤러에 대해 같은 방식으로 개체를 채울 필요가 있고 기본 컨트롤러의 동작 실행 방법으로이 작업을 수행합니다. –

관련 문제