2010-05-20 10 views
0

Je suis très nouveau pour StructureMap et je reçois l'erreur suivante:Nouveau Pour StructureMap - Obtenir Aucune instance par défaut Erreur 202

StructureMap Exception Code: 202 No Default Instance defined for PluginFamily Company.ProjectCore.Core.IUserSession, Company.ProjectCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Il semble frapper la première instance d'interface sur la compilation et lancers francs puis ci-dessus erreur:

private readonly IUserSession _userSession; 

public SiteMaster() 
{ 
    _userSession = ObjectFactory.GetInstance<IUserSession>(); // ERROR THROWN HERE 
    ... 
} 

Pour ce qu'il vaut la peine, je la référence PluginFamily surtout des interfaces:

[PluginFamily("Default")] 
public interface IUserSession 

ci-dessous est toute ma StructureMap.config

<StructureMap> 
    <Assembly Name="Company.ProjectWeb" /> 
    <Assembly Name="Company.ProjectCore" /> 
    <!-- 
    Use DefaultKey="Default" for standard cache 
    or DefaultKey="MemCached" for memcached cache. 
    --> 
    <PluginFamily 
     Assembly="Company.ProjectCore" 
     Type="Company.ProjectCore.Core.ICache" 
     DefaultKey="MemCached" /> 
    <!-- 
    Use DefaultKey="Default" for sending the email 
    in real time through the configured mail server 
    or use DefaultKey="MailQueue" to send the mail 
    in batches through another process 
    --> 
    <PluginFamily 
     Assembly="Company.ProjectCore" 
     Type="Company.ProjectCore.Core.IEmailService" 
     DefaultKey="MailQueue" /> 
    <!-- 
    Use DefaultKey="Default" for standard cache 
    or DefaultKey="UserSession" for memcached cache. 
    --> 
    <PluginFamily 
     Assembly="Company.ProjectCore" 
     Type="Company.ProjectCore.Core.IUserSession" 
     DefaultKey="UserSession" /> 
    <!-- 
    Use DefaultKey="Default" for standard cache 
    or DefaultKey="Redirector" for memcached cache. 
    --> 
    <PluginFamily 
     Assembly="Company.ProjectCore" 
     Type="Company.ProjectCore.Core.IRedirector" 
     DefaultKey="Redirector" /> 
    <!-- 
    Use DefaultKey="Default" for standard cache 
    or DefaultKey="Navigation" for memcached cache. 
    --> 
    <PluginFamily 
     Assembly="Company.ProjectCore" 
     Type="Company.ProjectCore.Core.INavigation" 
     DefaultKey="Navigation" /> 

Toutes les suggestions? Merci.

Répondre

0

L'auteur de StructureMap a déconseillé l'utilisation de la déclaration XML. Pourquoi ne pas le déclarer avec du code, comme ceci:

ObjectFactory.Initialize(x => 
    { 
     x.For<ICache>().Use<MemCached>(); 
     x.For<IEmailService>().Use<MailQueue>(); 
     x.For<IUserSession>().Use<UserSession>(); 
     x.For<IRedirector>().Use<Redirector>(); 
     x.For<INavigation>().Use<Navigation>(); 
    }); 

De cette façon, vous n'aurez pas à deviner si les choses sont correctement câblées. C'est aussi beaucoup plus facile à maintenir et moins de code.

+0

Michael - Merci! Cela a fonctionné avec brio. Semble l'architecture SM que je fais mon apprentissage est un peu daté. Très appréciée. –

2

La config me semble correcte à première vue. Appelez-vous ObjectFactory.Initialize avant que le code que vous avez publié s'exécute?

Je n'utilise pas moi-même d'attributs ou de fichiers de configuration, mais je ne pense pas que vous ayez besoin d'utiliser les deux.

De même, y a-t-il une raison pour laquelle vous voulez utiliser des attributs et/ou XML en premier lieu? Vous pouvez configurer vos instances via le code avec StructureMap via une interface fluide, et à mon humble avis c'est une meilleure façon de le faire (sauf si vous avez besoin d'échanger des implémentations en production, mais il existe d'autres options).

Voir aussi: http://structuremap.github.com/structuremap/ConfiguringStructureMap.htm

Mise à jour Après les commentaires

Ok, donc je téléchargé l'application, mais ne peut l'obtenir pour fonctionner, et ne peut pas vraiment prendre le temps de résoudre les problèmes. Donc, je suis désolé si je ne peux pas aider plus loin.

Cependant, j'ai fait un petit tour du code très brièvement, et je peux vous dire définitivement qu'une partie du code que j'ai vu pour utiliser IOC/DI est très dérangeant. À moins que ce soit le code de démarrage que le livre vous montre alors comment refactoriser, je ne recommanderais pas ceci comme source pour apprendre le modèle d'IOC ou StructureMap.

Voici un exemple de mauvais code:

public AccountService() 
{ 
    _accountRepository = ObjectFactory.GetInstance<IAccountRepository>(); 
    _permissionRepository = ObjectFactory.GetInstance<IPermissionRepository>(); 
    _userSession = ObjectFactory.GetInstance<IUserSession>(); 
    _redirector = ObjectFactory.GetInstance<IRedirector>(); 
    _email = ObjectFactory.GetInstance<IEmail>(); 
    _profileService = ObjectFactory.GetInstance<IProfileService>(); 
    _webContext = ObjectFactory.GetInstance<IWebContext>(); 
    _friendService = ObjectFactory.GetInstance<IFriendService>(); 
} 

Pour moi, cela a clairement service Géolocalisateur anti-modèle. Même à défaut, cela viole l'un des principes fondamentaux de la COI, à savoir que les dépendances doivent être explicites.

Votre application devrait avoir peu (ou même, si possible) un appel à ObjectFactory.GetInstance(), et à partir de ce moment-là, toutes les dépendances devraient être gérées via le framework en tant qu'arguments constructeurs.

Ainsi, le constructeur de compte de service ressemblerait à quelque chose comme:

public AccountService(IAccountRepository accountRepository) 
    { 
     //all arguments (not just account repo) would be passed into the ctor 
     //you also want to check for null for all arguments 
     _accountRepository = accountRepository; 
    } 

(noter également que 8 arguments est probablement un signe que cette classe a trop de responsabilités)

Il est vraiment trop pour obtenir dans un seul article, mais je recommanderais de trouver une meilleure source pour apprendre le modèle et l'outil.

+0

Phil, merci pour la réponse. J'ai téléchargé et l'application qui m'aide à démarrer avec SM. J'ai essayé de faire une recherche sur ObjectFactory.Initialize et n'ai rien trouvé. Quand (et où) cela devrait-il être appelé? Merci encore. –

+0

Il doit être appelé lorsque votre application démarre. Il peut y avoir d'autres façons d'initialiser SM, éventuellement plus anciennes ou plus récentes que la version que j'utilise actuellement. Voulez-vous publier un lien vers l'application que vous avez utilisée comme point de départ? –

+0

Phil - Merci encore. J'ai suivi les instructions de StructureMap en utilisant le livre ASP.NET 3.5 Social Networking d'Andrew Siemer. Le code est téléchargeable à partir du site de son éditeur ici: https://www.packtpub.com/code_download/1200 Faites-moi savoir si vous avez besoin d'autre chose. Merci beaucoup pour vos commentaires. –