2016-10-11 3 views
0

단순 인젝터와 종속성 인젝션을 사용하는 올바른 방법이 무엇인지 알아 내려고하고 있습니다.간단한 인젝터를 기본 클래스로 사용하기

나는 MasterController과 그 아래에서 작동하는 컨트롤러가 거의 없습니다. 그래서 기본적으로 내가 다른 클래스 또는 어쩌면 내 사용자 인터페이스에서 사용할 수있는 MasterController을 달성하려고합니다.

public class MasterController 
{ 
    public static Container _container = new Container(); 

    ILogger logger; 

    public IMainController MainController; 
    public ISubController SubController; 

    public MasterController() 
    { 
     _container.Register<ILogger, DebugLogger>(Lifestyle.Singleton); 
     _container.Register<IMainController, TestController>(Lifestyle.Singleton); 
     _container.Register<ISubController, Test2Controller>(Lifestyle.Transient); 

     _container.Verify(); 

     logger = _container.GetInstance<ILogger>(); 
     MainController = _container.GetInstance<IMainController>(); 
    } 

    public void RenameMainController(string _name) 
    { 
     MainController.Name = _name; 
    } 

    // more code here. 
} 

는 그럼 난 내 IMainController, ISubController, TestControllerTest2Controller 있습니다.

public interface IMainController 
{ 
    string Name { get; set; } 
    void DoSomething(); 
} 

public interface ISubController 
{ 
    string Name { get; set; } 
    void DoSomething(); 
    void SomeExtraFunctionality(); 
} 

public class TestController : BaseController, IMainController 
{ 
    private ILogger logger; 

    public List<ISubController> SubControllers = new List<ISubController>(); 

    public TestController(ISubController _SubController, ILogger _logger) 
    { 
     logger = _logger; 

     SubControllers.Add(_SubController); 
     logger.Log("TestController ready"); 
    } 

    public void DoSomething() { } 
} 

public class Test2Controller : BaseController, ISubController 
{ 
    private ILogger logger; 

    public Test2Controller(ILogger _logger) 
    { 
     logger = _logger; 
     logger.Log("TestController ready"); 
    } 

    public void DoSomething() { } 
    public void SomeExtraFunctionality() { } 
} 

나의 생각은 내가 몇 컨트롤러를 가지고있다 그리고 그들은 BaseController

public class BaseController 
{ 
    public string Name { get; set; } 

    // here is some code. 
} 

에서 몇 가지 일반적인 물건을 사용하지만 BaseController에 나는 또한 ILogger입니다을 사용하고 싶습니다. 어떻게 올바른 방법으로합니까?

이제 컨테이너에 BaseController를 추가했습니다.

_container.Register<BaseController>(Lifestyle.Transient); 

그리고

public BaseController(ILogger _logger) 
    { 
     logger = _logger; 
    } 

BaseController

에 생성자를 추가 한 다음 모든 컨트롤러 생성자 예 후

: base(_logger) 

을 추가

public TestController(ISubController _SubController, ILogger _logger) : base(_logger) 

을하지만이 올바른입니다이 작업을 수행하는 방법이나이 작업을 수행하는 "올바른"방법이 있습니까?

+0

문서를 읽어야합니다. 모든 정보가 압도적 일지 모르지만 내가 읽은 최고의 문서 중 하나입니다. 모든 것이 있습니다. –

답변

3

문서를 살펴 보셨습니까? Using Simple Injector

마스터 컨트롤러조차도 컨테이너를 알고 있어야하며 응용 프로그램을 통해 컨테이너에 액세스 할 수 없어야합니다. Simple Injector 설명서에 따라 응용 프로그램의 Composition Root, 즉 Application_Start 근처에 컨테이너를 만들고 구성하고 해당 컨테이너를 응용 프로그램의 나머지 부분에 노출시키지 않는 것이 좋습니다. 그렇지 않으면 실질적으로 Service Locator Anti Pattern으로 끝납니다.

구성의 일환으로 PerWebApiRequest 라이프 스타일 (MVC를 사용 중이거나 적절한 대안을 선택한다고 가정) 용 Simple Injector를 설정하면 컨테이너가 컨트롤러 생성자에 의존성을 자동으로 주입하고 사용자없이 IDisposable 의존성을 처리 할 수 ​​있습니다 컴포지션 루트에서 종속성을 구성하는 것 외에는 아무 것도하지 않아도됩니다. 따라서 콘트롤러가 없다는 것은 콘테이너가 실제로 존재한다는 것을 인식 할 필요가 없다.

관련 문제