看看下面的例子之间的过渡成分:城堡,共享一个装饰和装饰部件
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"));
}
}
我怎样才能让温莎实例“共享”短暂的组件,这样既“装饰”和“装饰”获取相同的实例?
编辑:由于设计正受到批评,我发布了一些更接近应用中正在进行的工作。也许有人可以提出一个更好的解决方案(如共享一个记录器和真正的任务之间的瞬时资源被认为是一种糟糕的设计)
EDIT2:Castle3通过引入了“绑定”的生活方式增加了对这个(http://docs.castleproject.org/Windsor.Whats-New-In-Windsor-3.ashx)支持
根据您的编辑,根本不需要TaskRunner中的MessageBuffer,因为它没有被使用。我怀疑我们仍在寻找一些远离实际问题的东西?我知道提取问题可能很困难,因此可以很容易地进行通信而不会使其歪曲,但基于手头的信息,您可以通过从TaskRunner中删除MessageBuffer依赖项来解决问题。 – 2010-05-28 11:32:00
我刚刚删除使用简洁:-)装饰的任务将消息放入消息缓冲区,装饰日志将把缓冲区中的消息放入记录器(log4net,控制台输出,不管) – Marius 2010-05-28 12:40:58