Se non avete bisogno di niente di eccezionale, un contenitore DI può essere davvero breve:
public class Container
{
private readonly Dictionary<Type,Func<Container,object>> factories;
private readonly Dictionary<Type,object> cache;
public Container()
{
this.factories = new Dictionary<Type,Func<Container,object>>();
this.cache = new Dictionary<Type,object>();
}
public void Register<TContract>(Func<Container,TContract> factory)
{
// wrap in lambda which returns object instead of TContract
factories[typeof(TContract)] = c => factory(c);
}
public TContract Get<TContract>()
{
var contract = typeof(TContract);
if (!cache.ContainsKey(contract))
{
this.cache[contract] = this.factories[contract](this);
}
return (TContract)this.cache[contract];
}
}
Quale si usa in questo modo:
var container = new Container();
container.Register<ICar>(c => new Car(
c.Get<IEngine>(), c.Get<IWheel>()));
container.Register<IWheel>(c => new Wheel());
container.Register<IEngine>(c => new Engine());
var car = container.Get<ICar>();
Ancora più minimalista sarebbe quella di fare la dipendenza iniezione senza un contenitore:
IWheel wheel = new Wheel();
IEngine engine = new Engine();
ICar car = new Car(engine, wheel);
Tuttavia, per oggetti grafici complessi può rapidamente ottenere compli per mantenere l'ordine di costruzione corretto durante i refactoring. Il contenitore non ha questo problema.
fonte
2012-01-23 14:23:16
È possibile taggare questo .net per ulteriori suggerimenti. –
guarda questa domanda: http://stackoverflow.com/questions/2515124/whats-the-simplest-ioc-container-for-c c'è un esempio online –
Se stai scrivendo una biblioteca, non dovresti utilizzare un contenitore DI completamente: http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 –