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<>));
});
}
}
articles de fond sur les profils que j'ai utilisé.
- http://devlicio.us/blogs/derik_whittaker/archive/2009/01/07/setting-up-profiles-in-structuremap-2-5.aspx
- http://structuremap.sourceforge.net/RegistryDSL.htm
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.
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