Castle, sharing a transient component between a decorator and a decorated component
        Posted  
        
            by Marius
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Marius
        
        
        
        Published on 2010-05-28T08:11:01Z
        Indexed on 
            2010/05/28
            13:22 UTC
        
        
        Read the original article
        Hit count: 322
        
castle-windsor
|ioc-container
Consider the following example:
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"));
    }
}
How can I make Windsor instantiate the "shared" transient component so that both "Decorator" and "Decorated" gets the same instance?
Edit: since the design is being critiqued I am posting something closer to what is being done in the app. Maybe someone can suggest a better solution (if sharing the transient resource between a logger and the true task is considered a bad design)
© Stack Overflow or respective owner