BT

New Early adopter or innovator? InfoQ has been working on some new features for you. Learn more

.NET Chain of Responsibility Library

| by Al Tenhundfeld on Sep 18, 2008. Estimated reading time: 1 minute |
Chain.NET (or NChain) is a generic implementation of Chain Of Responsibility design pattern for .NET and Mono platforms. Version 0.1, available on SourceForge, combines standard CoR design pattern with Command design pattern in order to "bring convenience and flexibility in command processing solutions."

NChain is loosely based on the Jakarta's Commons Chain package that is available for Java platform. In general, CoR is a pattern used to promote loose coupling, through separating command objects from a series of processing objects. Each processing object contains code to describe the types of command objects it can accept and will also delegate responsibility for processing incompatible objects to the next processor in the chain.

An example of a simple CoR pattern:

using System;
using System.Collections;
 
namespace Chain_of_responsibility
{
        public interface IChain
        {
                bool Process(object command);
        }
 
        public class Chain
        {
                private ArrayList _list;
 
                public ArrayList List
                {
                        get
                        {
                                return _list;
                        }
                }
 
                public Chain()
                {
                        _list = new ArrayList();
                }
 
                public void Message(object command)
                {
                        foreach ( IChain item in _list )
                        {
                                bool result = item.Process(command);
 
                                if ( result == true ) break;
                        }
                }
 
                public void Add(IChain handler)
                {
                        List.Add(handler);
                }
        }
 
        public class StringHandler : IChain
        {
                public bool Process(object command)
                {
                        if ( command is string )
                        {
                                Console.WriteLine("StringHandler can handle this message

: {0}",(string)command);
 
                                return true;
                        }
 
                        return false;
                }
        }
 
        public class IntegerHandler : IChain
        {
                public bool Process(object command)
                {
                        if ( command is int )
                        {
                                Console.WriteLine("IntegerHandler can handle this message

: {0}",(int)command);
 
                                return true;
                        }
 
                        return false;
                }
        }
 

 
        class TestMain
        {
                static void Main(string[] args)
                {
                        Chain chain = new Chain();
 
                        chain.Add(new StringHandler());                      
                        chain.Add(new IntegerHandler());
 
                        chain.Message("1st string value");
                        chain.Message(100);
                }
        }
}

NChain provides a similar though more robust architecture:
NChain Diagram

NChain requires further testing and performance monitoring to determine how appropriate it is for enterprise application architecture, but the project is open-source and has useful tutorials for getting started quickly. At this early stage, NChain appears to be a viable candidate for any scenario where you are considering using a command pattern but need to provide varying execution contexts for different types of commands.

Rate this Article

Adoption Stage
Style

Hello stranger!

You need to Register an InfoQ account or or login to post comments. But there's so much more behind being registered.

Get the most out of the InfoQ experience.

Tell us what you think

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread
Community comments

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread

Discuss

Login to InfoQ to interact with what matters most to you.


Recover your password...

Follow

Follow your favorite topics and editors

Quick overview of most important highlights in the industry and on the site.

Like

More signal, less noise

Build your own feed by choosing topics you want to read about and editors you want to hear from.

Notifications

Stay up-to-date

Set up your notifications and don't miss out on content that matters to you

BT