2011-08-25 206 views
3

我是新來的溫莎城堡,我試圖神交的基本知識......溫莎城堡(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(); 
} 

眼下這個總是返回「你好」。如果我想讓它返回「再見」,我需要改變什麼而不改變類的順序?

回答

1

我假設你想使用自動佈線。如果沒有,您可以爲每個組件進行手動註冊。 (編輯:看起來像你自己發現一個接一個的註冊:))。

查看所選答案這個問題,使用自動佈線,但控制特定類型的默認實現:

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

如果您使用溫莎3:

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 –