2009-11-04 2 views
9

저는 현재 코어 어셈블리와 winforms 어셈블리로 구성된 작은 C# 응용 프로그램을 만들고 있습니다. 나는 아마 이런 작은 일에 Ninject가 필요 없다는 것을 알지만, 그것을 시험해보고 싶다.C#, Ninject : 커널과 모듈은 어디에 두어야합니까?

어쨌든, Ninject로 작업하려면 모듈 집합을 작성하고 클래스가 반환되는지도 등을 이해해야합니다. 그런 다음 IKernel의 인스턴스를 만들고 모듈을로드합니다.

하지만 모듈을 어디에 보관해야합니까? 그리고 커널은 어디에 보관합니까? 물건은 어디로 간다?

답변

3

커널 용 정적 래퍼 클래스를 만들 수 있습니다. 그 방법으로 ServiceLocator.Resolve()와 같은 것을 할 수 있습니다.

서비스를 등록하려면 인라인과 모듈 등록의 두 가지 방법이 있습니다. 부트 스트래핑 할 때 둘 다로드되어야합니다. 모듈 구성에 좋습니다.

정적 클래스가 있고 자동 매핑 기능이 있기 때문에 StructureMap부터 시작하는 것이 더 쉬울 수도 있습니다. 확실히 그 자원을 통해 볼 -

3

+1 마렉의 답변을 :

그 스크린 캐스트는 시작 얻어야한다.

몇 가지 포인트 ...

당신은 심지어 작은 응용 프로그램에서,이 시도 확실히 맞다. 당신이 제기 한 것처럼 표면적으로 간단한 질문에 대해 열심히 생각하는 것도 중요합니다. DI의 경우, 정말로 감사하기 위해 실제로 실제로 약간의 작업을해야합니다. 제가 실제로 사용하기까지 오랫동안 "아, 작은 앱만"(거부) 캠프에있었습니다. .

일반적으로 서비스 탐지기에서 벗어나서 [컨테이너에 의존하지 않고] 주사 만하면되는 학교가 있습니다.

서비스 로케이터를 사용하지 않으면 아무도 컨테이너 (커널)의 위치를 ​​알아야 할 필요가 없습니다. 이것이 가장 좋습니다.

모듈은 주로 특정 전체 컨테이너 (커널)에 등록 할 일괄 처리를 분류하기위한 것입니다.

확실히 Ninject를위한 표준 '글로벌 컨테이너'싱글 톤 구현이 있습니까? 편집 : 그냥 하나를 발견 : - http://www.codethinked.com/creating-a-binding-factory-for-ninject

도 참조보기 Ninject: How do I inject into a class library?

+0

저는 이것을 수행 할 수있는 표준 방식을 찾고 있었으며 "훌륭합니다!"라고 생각했습니다. 내가 너를봤을 때. 나쁜 소식, 그 코드는 TERRIFICALLY UNTHREADSAFE입니다. 만약 내가 싱글 톤으로 커널을 포장해야한다면, 안전한 방법 (힌트, 정적 생성자)으로 직접 할 수는 있지만, 미래에 올 모든 사람들에게 경고해야한다. 그 기사는 thread-safe하지 않은 구현이다. –

+0

@JimmyHoffa 스레드가 안전하지 않다는 것에 동의합니다 (http://csharpindepth.com/articles/general/singleton.aspx에서 원하는 방식으로 적용하는 것이 좋습니다). 하지만 그보다 훨씬 나은 점은 그림의이 스레드 안전성 (다른 문제들)에 대한 필요성을 초기화가 발생할 수있는 명확한 장소가있는 컴포지션 루트를 갖는 것입니다. 완전히. –

+0

컴포지션 루트에 익숙하지 않지만 커널에 액세스 할 수 없으면 생성자를 주입 할 객체를 어떻게 요청합니까? 당신의 UI에서'UserManager'에 접근하기를 원합니다.'UserManager'는 생성시'IUserRepository'를 취합니다; 어떻게 커널에 접근하지 않고 (서비스 위치 지정자와 같은 것을 통해)'UserManager'를 얻었습니까? 당신은 단지'새로운 UserManager (???);'와'옳은 일이 생성자에게 넘겨지기를 기대할 수 있습니까? –

0

내 포인트 : 마렉 말했듯이, 당신은 IKernel 인스턴스를 포함하는 커널, 일부 (아마 정적) 래퍼를 만들어야합니다. Resolve < T> 메서드를 포함하고, 아마도 Load (INinjectModule 모듈) 메서드 - 모든 static을 포함해야합니다.

각 어셈블리에서이 어셈블리 내에 클래스를 매핑하는 고유 한 INinjectModule을 정의 할 수 있습니다.

커널 래퍼는 가장 일반적인 어셈블리 (일반적으로 Log 및 Utils가있는 어셈블리)의 '최저'에 있습니다. 커널은 모든 파트에서 액세스 할 수 있어야하므로 어셈블리에 있어야하며 다른 모든 어셈블리에서 참조해야합니다. 당신이 가지고 있지 않다면, 당신은 항상 하나를 창조 할만큼 자유 롭습니다. 이것은 다소 까다로울 수도 있습니다. 커널이 '최상위'어셈블리 (실행 가능한 커널)에있을 것으로 기대할 수 있습니다. 사실이 아니다.

어셈블리에서 모든 모듈을 등록하려면 각 어셈블리에서 Kernel.Load (새 XXModule)를 호출하기 만하면됩니다.

관련 문제