2009-03-08 5 views
1

성 윈저 IoC를 사용하려고합니다. 나는 아주 간단한 어플리케이션을 가지고있다. 내 인터페이스는 Test.Services 네임 스페이스에 있습니다. 컴파일 할 때 나는 다음과 같은 예외가 :성 윈저 내 서비스 유형을 찾을 수 없습니다

<configuration> 
    <configSections> 
    <section name="castle" 
     type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,  
     Castle.Windsor" /> 


    </configSections> 

    <castle> 
    <components> 
     <component id="HtmlTitleRetriever" 
       type="Test.HTMLTitleRetriever, Test"> 
     </component> 
     <component id="FileParser" 
       service="Test.Services.IParse, Test.Services" 
       type="Test.FileParser, 
         Test"> 
     </component> 
     <component id="FileDownloader" 
       service="Test.Services.IDownload, Test.Services" 
       type="Test.FileDownloader, Test"> 
     </component> 
    </components> 
    </castle> 

수있는 사람 :

", Test.Services 찾을 수 없습니다 유형 이름 Test.Services.IParse는"

이 내의 app.config입니다 내가 뭘 놓쳤는 지 말해 줄래? 코드의 작품에서 다음을 수행

감사

-Nick

답변

0
IWindsorContainer container = new WindsorContainer(); 

     container.AddComponent("FileDownlader", typeof(IDownload), 
      typeof(FileDownloader)); 
     container.AddComponent("FileParser", typeof(IParse), 
      typeof(FileParser)); 
     container.AddComponent("HTMLTitleRetriever", typeof(HTMLTitleRetriever)); 

     HTMLTitleRetriever retriever = container.Resolve<HTMLTitleRetriever>(); 

. Config 파일을 사용하여 매번 다시 컴파일 할 필요가 없도록하고 싶습니다.

+0

코드에서 다음 작업을 수행하면 모든 어셈블리와 컴파일러에 대한 의존성이 커지므로 컴파일러에 액세스 할 수 있어야합니다. 내 질문은 여전히 ​​의미 - 당신은 Test.Services.dll 출력 디렉토리에 config 파일을 사용하여 복사합니까? 컴파일러는 당신을 위해 그렇게하지 않을 것입니다. –

0

거의 닉! 당신은 WindsorContainer의 생성자에 XML 구성을 전달해야 내가 처음 성 윈저와 함께 연주하기 시작했을 때

IWindsorContainer container; 
container = 
    new WindsorContainer(
    new XmlInterpreter(
     new ConfigResource("castle") 
)); 

은 나뿐만 아니라이 "있어 나중에"에 달렸다. 구성 섹션을 조사 할 필요가 없습니다.

팁 : 트렁크에서 최신 버전을 다운로드하십시오. 같은 인터페이스에 여러 클래스를 대량 등록하는 데 정말 유용한 Register라는 새로운 메서드가 있습니다. 즉, ASP.NET MVC로 개발 중이며 IController가 많은 경우 Castle Windsor를 사용하여 자동 등록 할 수 있습니다. 따라서 구성 파일에서 지정할 필요가 없습니다!

public class WindsorControllerFactory : IControllerFactor 
{ 
    IWindsorContainer container; 
    public WindsorControllerFactory() 
    { 
    container = 
     new WindsorContainer(
     new XmlInterpreter(
      new ConfigResource("castleWindsor") 
    )); 

    container.Register(
     AllTypes.Of<IController>() 
     .FromAssembly(Assembly.GetExecutingAssembly()) 
     .Configure(component => component.LifeStyle.Transient 
     .Named(component.Implementation.Name) 
    )); 
    } 
} 
+0

IWindsorContainer 컨테이너 = 새 WindsorContainer (새 XmlInterpreter (새 ConfigResource ("성")))); 나는 이것을 시도 .. 같은 문제. 나는 obviouse를 확인 중이며 오타가 없음을 알 수 있습니다. "유형 Test.Services.IParse를 찾을 수 없습니다" –

+0

실제 코드로 질문을 업데이트 할 수 있습니까? 네임 스페이스와 어셈블리 이름이 올바른지 확인해야합니다. – eduncan911

2

바보 같은 질문이지만 등록한 클래스가 포함 된 어셈블리가 실제로 출력 디렉토리에 복사되는 것이 확실합니까?

+0

어리석은 질문이 아닙니다. 쉽게 수행 할 수 있습니다. 서비스가 포함 된 어셈블리에 대한 참조가 없으면 출력 폴더에 존재하지 않습니다. –

+0

알아. 나는 단지 확신하고있다 :) –

0

Test.Services 어셈블리 (Test.Services.dll)의 IParse 인터페이스가 있습니까?

구성의 유형 이름을 정의하는 데 사용되는 형식은 유형의 AssemblyQualifiedName 속성에서 가져올 수있는 형식과 동일합니다. 간단히 말해 다음과 같습니다.

네임 스페이스. 형식, 어셈블리.

제네릭 유형의 경우 this을 참조하십시오.

0

나는 동일한 문제가 있었고 에릭의 해결책이 문제를 해결하기 위해 노력했다. 나는 "Domain Models"프로젝트를 생성하고 나중에 그것을 "DomainModel"로 이름을 바꿨다. 그러나 모든 참조를 변경했으나 빈 폴더를 보면 어셈블리가 여전히 "도메인 모델"이라고 불렀다. 왜 성 윈저가 찾을 수 없는지.

+0

차갑다. :) (이름은 Eric이 아닌 eduncan911 임) – eduncan911