2016-03-01 99 views
3

我需要使用castle-windsor的Inline Dependencies功能。 我需要注入特定的組件鏈中的依賴關係。 我有這樣的情況。Castle Windsor Inline依賴關係

static void Main(string[] args) 
{ 

     var container = new Castle.Windsor.WindsorContainer(); 

     container.Register(
      Component.For<IHigherBusiness>().ImplementedBy<HigherBusiness>().DependsOn(Dependency.OnComponent<ILogger, FullDetailLogger>()) 
      ); 

     container.Register(Component.For<ISomeBusiness>().ImplementedBy<Business>()); 
     container.Register(Component.For<ILogger>().ImplementedBy<FullDetailLogger>().IsFallback()); 
     container.Register(Component.For<ILogger>().ImplementedBy<SimpleLogger>()); 


     var business = container.Resolve<IHigherBusiness>(); 
     business.DoSomething(); 

     var logger = container.Resolve<ILogger>(); 
     logger.Log("Some Log... ."); 



    } 
} 

public interface IHigherBusiness 
{ 
    void DoSomething(); 
} 

public class HigherBusiness : IHigherBusiness 
{ 
    private ISomeBusiness someBusiness; 

    public HigherBusiness(ISomeBusiness someBusiness) 
    { 
     this.someBusiness = someBusiness; 
    } 
    public void DoSomething() 
    { 
     someBusiness.DoSomething(); 
    } 
} 

public interface ISomeBusiness 
{ 
    void DoSomething(); 
} 

public class Business : ISomeBusiness 
{ 
    private ILogger logger; 
    public Business(ILogger logger) 
    { 
     this.logger = logger; 
    } 
    public void DoSomething() 
    { 
     logger.Log("Message"); 
    } 
} 


public interface ILogger 
{ 
    void Log(string message); 
} 

public class SimpleLogger : ILogger 
{ 

    public void Log(string message) 
    { 
     Console.WriteLine("Simple Logger: " + message); 
    } 
} 

public class FullDetailLogger : ILogger 
{ 
    public void Log(string message) 
    { 
     Console.WriteLine("Full detail Logger: " + message); 
    } 
} 

結果是:

Simple Logger: Message 
Simple Logger: Some Log... . 

但我相信這一點:

Full detail Logger: Message 
Simple Logger: Some Log... . 

我怎樣才能做到這一點?

回答

2

DependsOn只工作一個級別,所以你必須使Business取決於具體的​​。

你可以做一個絕招是這樣的:

static void Main(string[] args) 
    { 

     var container = new Castle.Windsor.WindsorContainer(); 

     container.Register(
       Component.For<IHigherBusiness>() 
       .ImplementedBy<HigherBusiness>() 
       .DependsOn(Dependency.OnComponent(typeof(ISomeBusiness), 
          "BusinessWithExtendedLogger")) 
      ); 
     container.Register(Component.For<ISomeBusiness>().ImplementedBy<Business>() 
       .DependsOn(Dependency.OnComponent<ILogger, FullDetailLogger>()) 
       .Named("BusinessWithExtendedLogger") 
      ); 
     container.Register(Component.For<ISomeBusiness>().ImplementedBy<Business>() 
       .DependsOn(Dependency.OnComponent<ILogger, SimpleLogger>()) 
       .IsDefault() 
      ); 
     container.Register(Component.For<ILogger>().ImplementedBy<FullDetailLogger>() 
       .IsFallback() 
      ); 
     container.Register(Component.For<ILogger>().ImplementedBy<SimpleLogger>()); 

     var business = container.Resolve<IHigherBusiness>(); 
     business.DoSomething(); 

     var normalBusiness = container.Resolve<ISomeBusiness>(); 
     normalBusiness.DoSomething(); 

     var logger = container.Resolve<ILogger>(); 
     logger.Log("Some Log... ."); 
     Console.ReadKey(); 

    } 

這將返回:

全部詳細記錄器:消息

簡單記錄器:消息

簡單記錄器:一些日誌......。

給你FullDetailLogger僅供IHigherBussiness