2014-02-25 1 views
0

셀프 인스턴스 (싱글 톤이 아닌)에 의존성 삽입을 생성하는 더 좋은 방법은 없을까요? 그냥 상황에 대한NInject to Self 인스턴스

public partial class MainForm : Form, IMessageLogger 
{ 
    public MainForm(IKernel kernel) : this() 
    { 
     this.kernel = kernel; 
     MainForm form = this; 
     kernel.Bind<IMessageLogger>().ToMethod((a) => { return form; }); 
     (...) 

: 자기 인스턴스는 Windows Forms의 내가 제대로 한 텍스트 상자 또는 상태 표시 줄에 그들을 제공하기 위해, 일부 컨트롤러에 의해 생성 된 특정 로거 이벤트를들을 필요가있다. 즉 나에게 .ToMethod() 잎하지만 난 그게 어색의 form 임시 값을 만들 찾을 수 있도록 .Self() 바인딩

.ToProvider()가 개미를 죽일 단지 캐논이다 사용하여 과도 범위를 가지고 있으며, 각 .Get()에 대한 새로운 객체를 생성합니다 반환되는 명령.

+1

kernel.Bind () 잘못 무엇 ToMethod은 ((A) => {이를 반환;}).; ? – Alex

+0

@Alex는 '이'가 'that'(익명의 위임자 컨텍스트는 오해의 소지가 있습니다. 왜냐하면이 컨텍스트가 커널이라고 가정하는 경향이 있으므로 @Alex는 시도하지 않았습니다. 그래서 나를위한 당신의 메시지가 받아 들여집니다. 대답을 추가하고 내 바보 같은 질문을 용서해주십시오! Thx – saamorim

+0

나는 방금 총을 맞았다. – Alex

답변

0
답변 :)의 역사에서

최단 대답은

kernel.Bind<IMessageLogger>().ToMethod((a) => { return this; }); 
1

매우 간단한 프로젝트가 아니라면, 양식이 IMessageLogger이어야한다고 생각하지 않습니다. 논리적으로 로깅과 창은 완전히 다른 두 가지 작업입니다. 다음은 권장할만한 옵션입니다.

  1. IMessageLogger을 구현하는 새 클래스를 만듭니다.
  2. 새 메시지가 기록 될 때 발생하는 이벤트를 IMessageLogger에 추가하십시오.
  3. 이 새로운 구체 구현 IMessageLogger을 IoC 컨테이너에 등록하십시오.
  4. 양식에서 IMessageLogger의 구현을 컨테이너에 요청하고 이벤트에 가입하십시오.
  5. 양식에 이벤트가 표시되면 메시지를 ListBox에 넣거나 무엇이든 넣습니다.
  6. 양식을 닫을 때처럼 어딘가에서 이벤트 구독을 취소하는 것이 좋습니다.

그것은 당신이 당신의 양식을 작성하는 IoC 컨테이너를 사용하는 경우 단순히 IMessageLogger 유형의 생성자에 새 매개 변수를 추가 아마 꽤 가능합니다.

이제 무엇이든에서 로그 메시지를 표시 할 수 있습니다. 이제 로깅 기능이 양식에서 분리되어 유지 보수가 쉬워집니다. 주 창을 열기 전에 메시지를 기록 할 수 있으므로 유용 할 수 있습니다.

+0

만약 내가 더 나아지기를 원한다면, 네 말이 맞다. 나는 프로듀서/소비자를 가질 것이므로 귀하의 대답에 +1하십시오. 하지만 제시된 시나리오에 대한 의도 된 대답은 매우 간단합니다. Thx에서 @Alex. – saamorim

관련 문제