2010-08-12 3 views
2

Situation: J'ai une interface, commeWindsor Castle: Configuration XML Dynamic Proxy sans cible

public interface ITestClass 
{ 
    string StringElement { get; } 
} 

Il y a une mise en œuvre pour elle:

public class TestClassImplementor : 
    ITestClass 
{ 
    public string StringElement 
    { 
     get { return "AAA"; } 
    } 
} 

J'ai une usine cela crée une instance d'implémentation:

public class TestClassFactory 
    { 
    public ITestClass Create() 
    { 
    return new TestClassImplementor(); 
    } 
} 

Je souhaite pouvoir olve l'implémentation en utilisant le fichier de configuration Castle Windsor (XML), mais en même temps ne pas configurer l'implémentation pour l'interface.

Pourquoi est-ce nécessaire: résoudre les services (Web). J'ai une interface de service (web), mais je n'ai pas accès à l'implémentation, comme c'est le cas sur un autre composant. Je veux être en mesure de taper simplement MyCastleUtility.Resolve<ITestClass>() et obtenir un service Web préparé. Je veux utiliser le fichier de configuration de Castle Windsor (XML) pour configurer le service auquel j'essaie d'accéder.

Le problème: si je ne peux pas accéder à l'implémentation, je ne peux pas le configurer dans le fichier de configuration. Ce que j'ai essayé jusqu'à présent: 1) Usines.

 <component id="mycompfactory" 
    type="MyTestProject.TestClassFactory, MyTestProject"/> 

     <component id="mycomp" 
      type="MyTestProject.ITestClass, MyTestProject" 
      factoryId="mycompfactory" factoryCreate="Create" /> 

je reçois le: Castle.MicroKernel.ComponentRegistrationException: Type MyTestProject.INewTestClass est abstraite. En tant que tel, il n'est pas possible de l'instancier en tant qu'exécution du service MyTestProject.INewTestClass

2) Proxies. Frappez le mur lorsque vous essayez de trouver un moyen de configurer ce "proxy doit être créé pour l'interface 'ITestClass'". Cible: configurez Castle Windsor pour créer une implémentation d'interface sans accéder directement à la classe qui implémente l'interface.

aide est très appréciée, Mindaugas

+0

Que voulez-vous dire par « Je ne peux pas accéder à la mise en œuvre ". Pourquoi ne pouvez-vous pas y accéder? Avez-vous besoin d'utiliser XML? –

+0

> Pourquoi ne pouvez-vous pas y accéder? Disons que nous avons deux services dans le système: Service1 et Service2. Service1 accède à Service2 via l'interface de service Web. Service1 utilise l'interface IService2 de Service2, car Service1 référence l'assembly Service2.Interfaces, mais il ne fait pas référence directement à l'assembly Service2.Application, où réside l'implémentation de l'interface IService2. C'est par conception et je pense que c'est correct. > Devez-vous utiliser XML? En général, oui. La configuration des composants est faite dans le XML et ne voudrait vraiment pas apporter une exception dans ce cas, c'est-à-direutilisez le code au lieu de XML. – Mindaugas

Répondre

1

Pour l'approche de l'usine:

  1. Avez-vous configuré aussi FactoryFacility dans votre config?

  2. Dans votre « mycomp », je pense que vous voulez utiliser « service » et non « type »:

<component id="mycomp" service="MyTestProject.ITestClass, MyTestProject" factoryId="mycompfactory" factoryCreate="Create" />

+0

Voilà: configuration FactoryFacility! Lorsque cette pièce manquante a été ajoutée au fichier de configuration de Windsor (XML), quand j'appelle Resolve sur mon interface, il frappe ma méthode Create() d'usine, où je peux instancier l'implémentation de l'interface comme je le souhaite. Btw, j'ai laissé 'taper' pour mon interface, je ne l'ai pas changé avec 'service', comme le changer me donne "Aucun composant supportant le service ITestClass a été trouvé" pendant la résolution des composants. – Mindaugas

+0

Cool. Je suppose que Windsor est assez intelligent pour savoir ce que vous voulez dire puisque vous utilisez une usine. – PatrickSteele

+0

re: "Aucun composant prenant en charge le service ITestClass n'a été trouvé" - cela ressemble à un bug dans Windsor, qui ignore simplement les composants qui n'ont pas 'type' spécifié lors de la lecture de XML. Je vais voir si je peux résoudre ce problème pour v2.5 –

Questions connexes