【发布时间】:2010-05-28 08:11:01
【问题描述】:
考虑以下示例:
public interface ITask
{
void Execute();
}
public class LoggingTaskRunner : ITask
{
private readonly ITask _taskToDecorate;
private readonly MessageBuffer _messageBuffer;
public LoggingTaskRunner(ITask taskToDecorate, MessageBuffer messageBuffer)
{
_taskToDecorate = taskToDecorate;
_messageBuffer = messageBuffer;
}
public void Execute()
{
_taskToDecorate.Execute();
Log(_messageBuffer);
}
private void Log(MessageBuffer messageBuffer)
{}
}
public class TaskRunner : ITask
{
public TaskRunner(MessageBuffer messageBuffer)
{
}
public void Execute()
{
}
}
public class MessageBuffer
{
}
public class Configuration
{
public void Configure()
{
IWindsorContainer container = null;
container.Register(
Component.For<MessageBuffer>()
.LifeStyle.Transient);
container.Register(
Component.For<ITask>()
.ImplementedBy<LoggingTaskRunner>()
.ServiceOverrides(ServiceOverride.ForKey("taskToDecorate").Eq("task.to.decorate")));
container.Register(
Component.For<ITask>()
.ImplementedBy<TaskRunner>()
.Named("task.to.decorate"));
}
}
如何让 Windsor 实例化“共享”瞬态组件,以便“装饰器”和“装饰器”获得相同的实例?
编辑:由于设计受到批评,我发布的内容更接近应用程序中正在执行的操作。也许有人可以提出更好的解决方案(如果在记录器和真实任务之间共享瞬态资源被认为是一个糟糕的设计)
Edit2:Castle3 通过引入“绑定”生活方式增加了对此 (http://docs.castleproject.org/Windsor.Whats-New-In-Windsor-3.ashx) 的支持
【问题讨论】:
-
根据您的编辑,您根本不需要 TaskRunner 中的 MessageBuffer,因为它没有被使用。我怀疑我们仍在寻找与手头实际问题相去甚远的东西?我知道很难提炼出一个问题,以便可以轻松地传达它而不会使其无法识别,但是根据手头的信息,您可以通过从 TaskRunner 中删除 MessageBuffer 依赖项来解决问题...
-
为简洁起见,我只是删除了该用法 :-) 装饰任务会将消息放入消息缓冲区,而装饰的日志记录会将消息从缓冲区放入记录器(log4net、控制台输出等)
标签: castle-windsor ioc-container