看看下面的例子之間的過渡成分:城堡,共享一個裝飾和裝飾部件
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