2010-01-03 7 views
0

En langage C#, en utilisant StructureMap 2.5.4, en ciblant les bibliothèques .NET Framework 3.5.Pourquoi obtenir un 202 dans deux chemins de code structuremap à configuration égale

J'ai pris l'étape pour prendre en charge plusieurs profils dans une configuration DI de carte de structure, en utilisant le modèle ServiceLocator avec l'activation Bootstrapper. La première installation chargeait le registre par défaut, en utilisant le scanner.

Maintenant, j'aime déterminer quelle est la configuration du registre que j'aime utiliser. Analyse et chargement de plusieurs assemblées avec des registres.

Semble que cela ne fonctionne pas pour l'implémentation réelle (Obtenir le 202, l'instance par défaut introuvable), mais une version de test dépouillée fonctionne. L'installation suivante.

  • Deux ensembles contenant Registries et mises en œuvre
  • les numérisant en cours d'exécution AppDomain, fournissant l'interface partagée, et demandant la création de l'instance, en utilisant les interfaces dans le constructeur (qui se traités Thanx au profil sur Invokation)

Code de travail exemple ci-dessous (même structure pour les autres configurations, mais avec des choses plus complexes, qui s'est un 202):

Quel type de couses sont possibles pour un 202, en nommant spécifiquement la Sy type stem.Uri, n'étant pas des handles par un type par défaut ?? (Uri n'a pas de sens)

// let structure map create instance of class tester, that provides the registered 
// interfaces in the registries to the constructor of tester. 

    public class Tester<TPOCO> 
       { 
        private ITestMe<TPOCO> _tester; 

        public Tester(ITestMe<TPOCO> some) 
        { 
         _tester = some; 
        } 

        public string Exec() 
        { 
         return _tester.Execute(); 
        } 
       } 

    public static class Main { 
      public void ExecuteDIFunction() { 
      ObjectFactory.GetInstance<Tester<string>>().Exec(); 
      } 
     } 



    public class ImplementedTestMe<TSome> : ITestMe<TSome> 
     { 
      public string Execute() 
      { 
       return "Special Execution"; 
      } 
     } 

    public class RegistryForSpecial : Registry 
     { 
      public RegistryForSpecial() 
      { 
       CreateProfile("Special", 
           gc => 
            { 
             gc.For(typeof(ITestMe<>)).UseConcreteType(typeof(ImplementedTestMe<>)); 

            }); 
      } 
     } 

EDIT: Il semblait l'interface manquante était en fait l'une étant déterminée d'exécution. Donc voici le prochain challange (et résolu):

J'ai fourni un objet par défaut chaque fois que StructureMap a besoin de créer l'objet. Comme:

x.ForRequestedType<IConnectionContext>() 
        .TheDefault.Is.Object(new WebServiceConnection()); 

De cette façon, je me suis débarrassé de l'erreur 202, car maintenant une instance réelle pourrait être utilisée lorsque la carte de structure avait besoin du type.

Ensuite était le remplacement de l'exécution. Cela n'a pas fonctionné au début en utilisant la méthode ObjectFactory.Configure. Au lieu de cela, j'ai utilisé la méthode ObjectFactory.Inject pour remplacer l'instance par défaut. Fonctionne comme un charme.

ObjectFactory.Inject(typeof(IConnectionContext), context); 

Aimer l'effort communautaire.

Répondre

2

Le code d'erreur 202 signifie qu'une instance par défaut n'a pas pu être créée pour le type demandé. Votre code de test n'est apparemment pas égal à votre code réel qui échoue. Si vous obtenez une erreur sur Uri, vous avez probablement une dépendance qui nécessite un Uri dans son constructeur. Ce n'est peut-être pas la classe que vous demandez - elle peut être l'une des dépendances de cette classe - ou l'une des dépendances des dépendances ...Quelque part sur la ligne, quelqu'un demande à StructureMap de résoudre un Uri, ce qu'il ne peut pas faire, sans l'aide de votre part.

+0

Semble être une interface manquante transmise à l'une des interfaces supérieures. Définitivement un type de propriété Uri. Merci de me remettre sur les rails! – Hans