2012-10-02 3 views
2

2 개의 프로젝트가 있는데 하나는 MVC 사이트이고 다른 하나는 클래스 라이브러리입니다. MVC 사이트는 클래스 라이브러리를 참조합니다.Castle.Windsor는 코드에서 어셈블리가 참조되지 않는 한 FromAssembly.InThisApplication을 사용하여 설치 프로그램을 실행하지 않습니다.

MVC 사이트 및 클래스 라이브러리에 IWindsorInstaller 구현이 있습니다. MVC 사이트에는 클래스 라이브러리에 정의 된 모든 클래스를 직접 참조하는 코드가 없으며 다른 곳에서 정의 된 모든 인터페이스 구현입니다. MVC의 사이트에서

, 응용 프로그램에서 내가 클래스 라이브러리에서 설치 프로그램을 호출하지 않습니다 보통

var container = new Castle.Windsor.WindsorContainer(); 
container.Install(FromAssembly.InThisApplication()); 

이 일을 해요 시작합니다. 그러나 내가 이것을 할 경우

container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>()); 

설치 프로그램이 두 번 호출됩니다. 캐슬은 다른 어셈블리에 대한 코드 내 참조를 InThisApplication에서 받아 들여야합니다. 이 작업을 수행하여 문제를 해결할 수 있습니다.

container.Install(FromAssembly.This()); 
container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>()); 

하지만 다른 어셈블리를 직접 참조하지 않아도됩니다.

업데이트는 네임 스페이스는 다음과 같습니다

  • MVC 응용 프로그램이
  • 클래스 라이브러리는 당신이 당신의 어셈블리 이름을 경우 작동합니다

답변

2

MyApp.Individuals.Service입니다 MyApp.OnlineProducts.Service입니다 필요한 명명 규칙에 따라 기본 응용 프로그램 어셈블리 이름이 MyApp.exe 인 경우 MyApp. *. dll (예 : FirstClassLibrary.Whatever.dll 및 MyApp.SecondClassLibrary.dll)과 같은 다른 클래스 라이브러리의 이름을 지정하고 Windsor가 명명을 준수하는 모든 관련 라이브러리를 가져와야합니다 협약. 이 문제를 설명하는 Windsor 설명서의 this page을 참조하십시오.

2

FromAssembly.InThisApplication()은 호출 어셈블리를 접두어로 사용하여 어셈블리를 일치시킵니다. MyApp.dll에서 호출하면 MyApp.Core.dll & MyApp.Stuff.dll과 일치합니다.

그래서 클래스 라이브러리의 이름을 바꾸는 것이 옵션 일 수 있습니까?

그렇지 않으면, 당신은 사용할 수 있습니다 FromAssembly.InDirectory (새 AssemblyFilter ("C : \ 디렉토리", ". * dll을"))
당신의 "구성 요소 어셈블리"를 찾을 수 있습니다.

== UPDATE == 내 의견은 오해의 소지가 있습니다.

FromAssembly.InThisApplication()은 호출 어셈블리에서 참조한 어셈블리 만 둘러 봅니다. 웹 응용 프로그램/WCF 서비스를 구축 할 때

+0

코드에서 어셈블리에 대한 참조를 추가 할 때 왜 작동합니까? –

+1

IWindsorInstaller를 찾을 어셈블리를 식별해야합니다. FromAssembly.Containing <>은 어셈블리를 찾는 또 다른 방법입니다. 조립품을 찾는 방법을 정의해야합니다. ZERO 코드 참조를 원한다면 dir & filename 패턴을 사용하면됩니다. –

+0

두 어셈블리가 같은 이름의 첫 번째 부분을 가지고있을 때'FromThisApplication'이 작동하지 않아야합니까? –

0

여기에 다른 답변에 따라,

var container = new Castle.Windsor.WindsorContainer(); 
container.Install(FromAssembly.InThisApplication()); 

은 App_Code 폴더에 거주하지 않는 호출하는 클래스를 확인하십시오.Winsdor 부트 스트랩 프로세스는 AppInitialize() 메서드를 사용하여 App_Code 어딘가에 있지만 App_Code 폴더의 실제 부트 스트랩 코드를 사용하면 여기에 언급 된 어셈블리 접두어 변환을 위반하는 별도의 App_Code 어셈블리에 살게되므로이 실수는 쉬운 실수입니다 .

관련 문제