Vous pourriez construire votre propre conteneur d'objets simple si vous ne pouvez pas utiliser un de tiers (ce qui est ridicule mais je comprends, j'ai été dans cette situation avant)
voici quelque chose que j'ai improvisé qui pourrait vous aider à démarrer... je ne l'ai pas testé et c'est vraiment approximatif, mais j'espère que vous comprenez l'idée
public static class ObjectFactory
{
static IDictionary _factory = new Dictionary();
public static void Register(Func builder)
{
if (_factory.ContainsKey(typeof(T)))
_factory[typeof(T)] = builder;
else
_factory.Add(typeof(T), builder);
}
public static T GetInstance()
{
if (_factory.ContainsKey(typeof(T)))
throw new ArgumentException(string.Format("Type <{0}> not registered in ObjectFactory", typeof(T).Name));
return ((Func)_factory[typeof(T)])();
}
}
public interface IClientManager { }
public class RealClientManager : IClientManager { }
public class MockClientManager : IClientManager { }
public class MyView
{
public MyView()
{
// probably better to do this registry in some sort of application initialization
ObjectFactory.Register(() => new RealClientManager());
}
public void SomeMethodThatNeedsClientManager()
{
var clientManager = ObjectFactory.GetInstance();
}
}
public class MyTester
{
[TestMethod()]
public void SomeTest()
{
var view = new MyView();
// swap the client manager in the test
ObjectFactory.Register(() => new MockClientManager());
// Asserts
}
}
vous pouvez voir que si vous avez déjà utilisé StructureMap ou un autre conteneur d'injection de dépendances auparavant, ils font beaucoup de choses similaires avec beaucoup d'agrément supplémentaire comme parcourir votre graphe d'objets et enregistrer automatiquement des objets en fonction de conventions, gérer les cycles de vie des objets, la portée des conteneurs, etc... beaucoup de ces choses vous pourriez les implémenter vous-même aussi... mais vous devriez vraiment utiliser une solution éprouvée comme StructureMap