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?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top