2010-08-24 6 views
0

J'appelle ma fabrique personnalisée que j'ai créée (PhotoServiceFactory), qui est un singleton qui me permet d'obtenir un type de service personnalisé spécifique (dans ce cas, FacebookService). FacebookService est également un singleton. Dans FacebookService, j'ai exposé une instance de FacebookAlbumPhoto via une propriété. Je l'ai fait parce que je n'ai pas besoin d'avoir une tonne du même code encore et encore créer une nouvelle instance de FacebookAlbumPhoto ... Je peux obtenir une instance en utilisant la propriété de FacebookService.Tentative d'utilisation de mon singleton qui fait référence à un autre singleton

PhotoServiceFactory service = PhotoServiceFactory.CurrentPhotoServiceFactory; 
FacebookService facebookService = (FacebookService)service.GetAPIService(APIType.Facebook); 

FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID); 

Donc, tout cela est mis en place maintenant, j'ai créé tout cela et juste le tester maintenant.

Ce qui se passe est mon code bombarde sur cette ligne à:

FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID); 

L'erreur que je reçois est lorsque je tente de faire référence à la facebookService. FacebookAlbumPhoto exemple:

currentSession = '_singletonInstance.CurrentSession' a lancé une exception de type 'System.Threading.ThreadAbortException'

Je ne sais pas si elle est parce que le service est singleton sur un thread et puis il essaie de faire référence à un autre singleton qui est sur un fil complètement différent et ce n'est tout simplement pas possible? Qu'il n'est pas possible d'imbriquer des singletons comme ça? Ou pourrait-il s'agir d'un autre problème? Parce que je ne peux pas le voir.

Voici mon ServiceFactory:

public class PhotoServiceFactory 
{ 
    private static PhotoServiceFactory _singletonInstance; 
    private PhotoServiceFactory(){} 

    public static PhotoServiceFactory CurrentPhotoServiceFactory 
    { 
     get 
     { 
      _singletonInstance = _singletonInstance ?? (_singletonInstance = new PhotoServiceFactory()); 
      return _singletonInstance; 
     } 
    } 

    public object GetAPIService(APIType apiType) 
    { 
     object apiService = null; 
     switch (apiType) 
     { 
      case APIType.Facebook: 
       apiService = FacebookService.CurrentService; 
       break; 
      // rest of code 
     } 

     return apiService; 
    } 

Ainsi, le principal singleton ici service a une propriété pour obtenir sa session connexe:

Voici le FacebookServiceClass:

public class FacebookService 
{ 
    private static FacebookService _singletonInstance; 

    private FacebookService(){} 

    public FacebookSession CurrentSession 
    { 
     get 
     { 
      return FacebookSession.GetCurrentSession(); 
     } 
    } 

    /// <summary> 
    /// Gets the current facebook service singleton instance. 
    /// </summary> 
    /// <value>The current facebook service.</value> 
    public static FacebookService CurrentService 
    { 
     get 
     { 
      _singletonInstance = _singletonInstance ?? (_singletonInstance = new FacebookService()); 
      return _singletonInstance; 
     } 
    } 

    public FacebookAlbumPhoto FacebookAlbumPhoto 
    { 
     get 
     { 
      return new FacebookAlbumPhoto(); // create an instance automatically so we can start working with this object 
     } 
    } 
} 

Voici la classe de session:

public class FacebookSession 
{ 
    const string loginCallbackUrl = "http://localhost/PhotoUpload/FacebookOauth.aspx"; 

    private FacebookSession() 
    { 
    } 

    public string UserID { get; private set; } 

    public static FacebookSession GetCurrentSession() 
    { 
     //....bunch of other logic is here 
     FacebookSession facebookSession = CreateNewSession(); 
     return facebookSession; 
    } 

    public FacebookSession CreateNewSession() 
    { 
     //...some code here 
     FacebookSession newFacebookSession = new FacebookSession 
     //... rest of code... 
     return newFacebookSession; 
    } 
    // ... rest of code 
} 

MISE À JOUR:

Comme demandé voici ma classe FacebookAlbumPhoto que j'ai créé:

public class FacebookAlbumPhoto : FacebookPhotoBase 
    { 
     private FacebookSession currentSession; 

     public FacebookAlbumPhoto() 
     { 
      currentSession = FacebookService.CurrentService.CurrentSession;    
     } 

     #region Methods 

     public FacebookAlbumPhoto GetFacebookAlbumPhoto(string photoID) 
     { 
      ...more code 
      FacebookPhotoRequest request = new FacebookPhotoRequest(currentSession.UserID, photoID); 
      ...more code 

      FacebookAlbumPhoto facebookPhoto = ParseFacebookPhoto(json); 

      return facebookPhoto; 
     } 
...rest of code 
} 
+0

J'ai essayé de « bien rangé-up » votre extraits de code un peu, la suppression '# et préfixer commentaires région de l' 'avec //' pour essayer de faire un peu plus facile à lire car il y a beaucoup de code là-bas =). – Rob

+0

De plus, vous n'avez pas inclus le code pour 'FacebookAlbumPhoto' qui serait utile car l'erreur se produit dans' GetFacebookAlbumPhoto (selectedPhotoID) 'ou le constructeur de FacebookAlbumPhoto, aucun de ces deux n'étant disponible pour examen à présent ... – Rob

+0

Je ne suis pas sûr que l'erreur se produise dans cette classe parce qu'elle n'atteint aucun point de débogage que j'ai défini dans GetFacebookAlbumPhoto, ce qui explique pourquoi c'est un mystère pour moi ... Je parviens à marquer des points au FacebookService et à la Session, mais ensuite quand il essaye d'utiliser cette instance de FacebookAlbumPhoto (l'instance que j'ai l'intention d'obtenir de la propriété de FacebookService), il appelle du code que je ne possède pas de points de débogage mais je ne vois absolument nulle part ailleurs qu'il pourrait exécuter du code de sorte que c'est très bizarre. – PositiveGuy

Répondre

1

Deux choses. Tout d'abord, n'oubliez pas de lire Skeet's catalogue of singleton implementations. Deuxièmement, essayez de casser votre code juste avant l'endroit où l'exception se produit, puis affichez votre dialogue "Exception" (ctrl-alt-e). Cliquez sur la case "Lancer" à côté de la CLR (deuxième ligne de dialogue) et appuyez sur OK. Continuez à déboguer votre code. Les résultats peuvent vous indiquer où se situe le vrai problème.

N'oubliez pas de revenir à la boîte de dialogue Exception et retirez cette coche de la case à cocher, une fois que vous avez terminé.:)

+0

Merci beaucoup, je vais essayer! – PositiveGuy

+0

Merci beaucoup, ça m'a aidé car j'avais mis un point de débogage et j'ai essayé de faire F11 tout le long, mais ça ne m'avait toujours pas montré avant, là où c'était le dernier bombardement. En utilisant cela, j'ai pu voir où F11 n'a pas réussi à me montrer. J'ai trouvé que je n'avais pas défini de point d'arrêt au retour de FacebookAlbumPhoto(); code dans la propriété de mon FacebookService. Il bombarde là-bas. – PositiveGuy

+0

Donc, je me demande quand j'essaie d'utiliser cette propriété comme ça, que vous ne pouvez pas commencer à utiliser cette propriété comme ça? FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto (selectedPhotoID); Donc, il s'agit de la propriété FacebookAlbumPhoto de mon objet facebookService. J'ai juste un nouveau FacebookAlbumPhoto de retour dans cette propriété dans mon get. Puis immédiatement mettre un point juste après pour essayer et utiliser cette propriété qui me renvoie une instance de FacebookAlbumPhoto..voir ci-dessus. – PositiveGuy

0

création d'instance distincte de l'initialisation