DictionaryAdapter is a lightweight tool that on the fly generates strongly typed wrappers on top of IDictionary
(and its generic brother) type. Not only that, but it also has some other capabilities like support for INotifyPropertyChanged
, editability, error handling, etc...
It is extremely useful in the context of web applications, as there are many untyped dictionaries in use, such as Session
, Form
, QueryString
, Context.Items
, and MonoRail's PropertyBag
and Flash
. It can also wrap settings from app.settings
/web.settings
file.
It can also be used with any other dictionary in any other part of your application.
Hello world example of DictionaryAdapter is just few lines of code.
After you've added a reference to Castle.Core.dll
you need to import the following namespace:
using Castle.Components.DictionaryAdapter;
First we just need a plain simple interface:
public interface IHelloWorld
{
string Message { get; }
}
We can now create an adapter for the interface:
var dictionary = new Hashtable();
var factory = new DictionaryAdapterFactory();
var adapter = factory.GetAdapter<IHelloWorld>(dictionary);
dictionary["Message"] = "Hello world!";
Debug.Assert(adapter.Message == "Hello world!");
We start with the dictionary we want to wrap with the adapter. In actual applications this would for example be http session.
Then we need something to create the adapter with. Meet DictionaryAdapterFactory
.
ℹ️ Reuse DictionaryAdapterFactory
: The DictionaryAdapterFactory
is like DynamicProxy's ProxyGenerator
- you normally wouldn't just create it on the spot each time you need an adapter. You should strive to reuse it as much as possible, so it's a good idea to make it a singleton.
With the factory we create the adapter passing in the dictionary we want to wrap.
That's it - you can now read from the dictionary using the adapter.
The interface in the example above had just a getter for its sole property, but if it also had a setter we could write to it as well.
adapter.Message = "Hello world!";
Debug.Assert(dictionary["Message"] == "Hello world!");@@