2011-08-25 208 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 –