2011-08-25 6 views
3

내가 성 윈저에 새로운 오전과 기초를 grok 수하려고 ... 성 윈저 (IOC) 기본

내가 가지고있는 다음 코드는 ...

namespace WindowsBash.Models 
{ 
    public interface IShouter 
    { 
     string Display(); 
    } 

    public class Shout : IShouter 
    { 
     private IMessage _message; 

     public Shout(IMessage message) 
     { 
      _message = message; 
     }   

     public string Display() 
     { 
      return _message.TheMessage(); 
     } 
    } 

    public interface IMessage 
    { 
     string TheMessage(); 
    } 

    public class MessageHello : IMessage 
    { 
     public string TheMessage() 
     { 
      return "Hello"; 
     } 
    } 

    public class MessageBye : IMessage 
    { 
     public string TheMessage() 
     { 
      return "Bye"; 
     } 
    } 
} 

나는 다음 방법을 윈저가 무엇을하고 있는지 시험 해보기 위해 ....

private void TestIOC() 
{ 
    var container = new WindsorContainer(); 
    container.Register(
     AllTypes.FromAssemblyContaining<IShouter>() 
       .Where(x => x.Namespace.StartsWith("WindowsBash")) 
       .WithService.AllInterfaces()); 

    var MyShouter = container.Resolve<IShouter>(); 
    var result = MyShouter.Display(); 
} 

지금이 항상 "Hello"를 반환합니다. "Bye"를 반환하고 싶다면 클래스 순서를 변경하지 않고 무엇을 변경해야합니까? 난 당신이 컴파일 된 클래스의 외부 구성 할 수 있도록이 XML에서 수행 보았다

답변

1

자동 배선을 사용한다고 가정합니다. 그렇지 않은 경우 각 구성 요소에 대한 수동 등록을 수행 할 수 있습니다. (편집 : 당신이 스스로 한개씩 등록한 것을 발견 한 것 같습니다 :)). 당신이 윈저 3 사용하는 경우

Castle Windsor: Using convention registration along with specific implementations

+0

감사합니다. 가장 도움이되었습니다. 나는 자동 배선의 이점이 갈 길이라는 것을 알 수있다. –

1

내가 일 듯이 함께했다 ...

private void TestIOC() 
    { 
     var container = BootstrapContainer(); 
     container.Register(
      Component.For<IShouter>().ImplementedBy<Shout>(), 
      Component.For<IMessage>().ImplementedBy<MessageBye>()); 

     var shell = container.Resolve<IShouter>(); 
     var result = shell.Display(); 

     container.Dispose(); 
    } 
0

이름이나 ResolveAll로 등록하고 올바른 것을 찾을 수 있습니다. 그러나 여러 구현을 등록 할 때 모든 구현을 사용하기를 원하기 때문에 수행하려는 작업이 실제로 유용하지는 않습니다.

1

:

자동 배선을 사용하지만 특정 형식에 대한 기본 구현을 제어하려면이 질문에 대해 선택한 답변을 참조

private void TestIOC() 
{ 
    var container = new WindsorContainer(); 
    container.Register(
     AllTypes.FromAssemblyContaining<IShouter>() 
       .Where(x => x.Namespace.StartsWith("WindowsBash")) 
       .WithService.AllInterfaces() 
       .ConfigureFor<MessageBye>(c => c.IsDefault())); 

    var MyShouter = container.Resolve<IShouter>(); 
    var result = MyShouter.Display(); 
} 

그러나 일반적으로 여러 구성 요소 중 하나의 구성 요소 만 원한다면 다른 구성 요소를 설치하지 마십시오. 특정 컨텍스트에 대해 원하는 것만 컨테이너에 넣으십시오.

+0

Windsor 2.5.1.0을 사용하고 있습니다. –