Comment résoudre des instances avec des paramètres de constructeur dans un conteneur IOC personnalisé?
-
19-08-2019 - |
Question
J'essaie de créer ma propre inversion de conteneur de contrôle. À l'heure actuelle, je stocke les objets avec leurs types dans un dictionnaire et je résous une référence à la demande. Mais je veux permettre de résoudre une référence ou une nouvelle instance. Je peux créer une nouvelle instance avec la classe Activator. Mais que se passe-t-il si le constructeur de l'objet à résoudre prend 1, 2 ou des paramètres?
Par exemple, je veux pouvoir dire quelque chose comme:
Container.register<IFoo>(new Foo(Proxy));
Container.register<IBar>(new Boo(Proxy, DataThing));
et résolvez-le comme
IFoo MyFoo = Resolver.resolve<IFoo>();
IBar MyBar = Resolver.resolve<IBar>();
où MyFoo est instancié avec le paramètre donné Proxy et MyBar avec Proxy et DataThing .
Que doit résoudre pour que cela se produise?
La solution 2
J'ai décidé de le scinder en méthodes. Une résolution, qui restitue l'instance stockée dans le conteneur. Et une création qui instancie une nouvelle instance.
quelque chose comme:
public T Create<T>()
{
if (registeredTypes.ContainsKey(typeof(T)))
return (T)Activator.CreateInstance(registeredTypes[typeof(T)].
GetType());
else
throw new DependencyResolverException("Can't
create type. Type " + typeof(T) + "
not found.");
}
Autres conseils
Paiement http://funq.codeplex.com . C'est un très petit conteneur qui utilise des expressions lambda pour définir la fonction à résoudre. Gère plusieurs paramètres.
Activator peut créer une instance d'une classe ayant des constructeurs avec des paramètres.
Découvrez cette surcharge de la de la méthode CreateInstance .
Vous pouvez fournir un classeur personnalisé à rechercher manuellement le constructeur correspondant.
Dans votre cas, la méthode resolvez doit renvoyer la référence à une instance de la classe enregistrée (new Boo (Proxy, DataThing) dans votre exemple)