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
}
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
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
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