我需要使用 caSTLe-windsor 的内联依赖特性。 我需要在依赖链中注入(inject)特定组件。 我有这样的情况。
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... .
我怎样才能做到这一点?
最佳答案
DependsOn
仅向下一级工作,因此您必须使 Business
依赖于特定的 ILogger
。
你可以这样做:
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();
}
返回:
Full detail Logger: Message
Simple Logger: Message
Simple Logger: Some Log... .
只为 IHigherBussiness
提供 FullDetailLogger
关于c# - CaSTLe Windsor 内联依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35717276/