C# 尝试使用引用另一个单例的我的单例
我正在调用我创建的自定义工厂(PhotoServiceFactory),它是一个单例,允许我返回特定的自定义服务类型(在本例中为FacebookService)。FacebookService也是一种单例服务。在FacebookService中,我通过属性公开了FacebookAlbumPhoto的一个实例。我这样做是因为我不必一次又一次地使用大量相同的代码来创建FacebookAlbumPhoto的新实例……我可以使用FacebookService的属性获得一个实例C# 尝试使用引用另一个单例的我的单例,c#,C#,我正在调用我创建的自定义工厂(PhotoServiceFactory),它是一个单例,允许我返回特定的自定义服务类型(在本例中为FacebookService)。FacebookService也是一种单例服务。在FacebookService中,我通过属性公开了FacebookAlbumPhoto的一个实例。我这样做是因为我不必一次又一次地使用大量相同的代码来创建FacebookAlbumPhoto的新实例……我可以使用FacebookService的属性获得一个实例 PhotoServiceF
PhotoServiceFactory service = PhotoServiceFactory.CurrentPhotoServiceFactory;
FacebookService facebookService = (FacebookService)service.GetAPIService(APIType.Facebook);
FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);
现在一切都准备好了,我创建了所有这些,现在正在测试
发生的事情是我的代码在这一行爆炸:
FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);
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;
}
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
}
我遇到的错误是在尝试引用facebookService.FacebookAlbumPhoto实例时:
FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);
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;
}
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
}
CurrentSession='\u singletonInstance.CurrentSession'引发了“System.Threading.ThreadAbortException”类型的异常
所以我不知道这是否是因为服务singleton在一个线程上,然后它尝试引用另一个在完全不同的线程上的singleton,这是不可能的?不可能像这样安顿单身汉?或者这完全是另一个问题?因为我看不见
这是我的服务工厂:
FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);
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;
}
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
}
因此,主singleton here服务有一个属性来获取其相关会话:
FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);
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;
}
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
}
以下是FaceBookService类:
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
}
}
}
更新:
FacebookAlbumPhoto facebookPhoto = facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);
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;
}
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
}
根据要求,以下是我创建的FacebookAlbumPhoto类:
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
}
两件事。首先,记得仔细阅读。 第二,尝试在异常发生之前中断代码,然后打开“异常”对话框(ctrl-alt-e)。单击CLR(第二行对话)旁边的“抛出”复选框并点击ok。继续调试代码。结果可能会告诉你真正的问题在哪里
完成后,不要忘记返回异常对话框并从复选框中删除该复选框。:) 将实例创建与初始化分开我尝试过稍微“整理”一下您的代码片段,删除
#region
s并在注释前面加上/
,以尝试使其更易于阅读,因为那里有很多代码=),您尚未包含facebook相册照片
的代码,该代码会很有用,因为错误发生在getfacebook相册照片(selectedPhotoID)
或facebook相册照片的构造函数中,目前这两个都不可供查看…我不确定该类中是否发生了错误,因为它没有达到我在GetFacebookAlbumPhoto中设置的任何调试点,这就是为什么这对我来说是一个谜…我可以将点分解到FacebookService和会话,但当它尝试使用它时FacebookAlbumPhoto实例(我打算从FacebookService的属性获取的实例)它正在调用一些我想我没有调试点的代码,但我看不到任何其他地方它可以从中运行代码,所以这很奇怪。我的意思是,我试图通过使用我的服务的属性来设置FacebookAlbumPhoto类型的变量,而该属性生成FacebookAlbumPhoto的新实例,以便我调用它,这是不是很奇怪FacebookAlbumPhoto.GetFacebookAlbumPhoto返回FacebookAlbumPhoto lol?我不想使FacebookAlbumPhoto成为静态类,也不想使GetFacebookAlbumPhoto成为静态方法,因此…对我来说,这很简单..我可以通过该服务属性实例化FacebookAlbumPhoto类,以便调用GetFacebookAlbumPhoto()来设置我的FacebookAlbumPhoto变量。我不知道,这是不是很糟糕?谈论上次回复中的这句话:FacebookAlbumPhoto facebookPhoto=facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);我只是觉得它是服务类的一个很方便的成员,可以为我需要使用的任何类生成一个新实例……在这个例子中是FacebookAlbumPhoto。稍后在FacebookService类中,我还会有其他内容,例如FacebookAlbum属性等。非常感谢,我将尝试一下!非常感谢,这很有帮助,因为我已经设置了一个调试点,并一直尝试F11,但它仍然没有显示我之前,它上次爆炸的地方。使用这个,我能够看到F11没有显示给我的地方。我发现我没有在返回new FacebookAlbumPhoto()时设置断点;my FacebookService属性中的代码。它在外面爆炸。所以我想知道,当我试图像这样使用那个属性时,你们不能就这样开始使用那个属性吗?FacebookAlbumPhoto facebookPhoto=facebookService.FacebookAlbumPhoto.GetFacebookAlbumPhoto(selectedPhotoID);因此,它是在我的facebookService对象的FacebookAlbumPhoto属性处释放的。我的get中有一张新的FacebookAlbumPhoto在该属性中返回。然后立即在后面加上一个点,尝试使用该属性,该属性会将FacebookAlbumPhoto的实例发回给我。请参见上文。我还注意到,当我尝试从FacebookService类获取CurrentService时,FacebookAlbumPhoto的构造函数中出现了线程中止异常……您可以看到上面这一行。有关此问题的一些信息一直告诉我,你应该修复你的单件,使之匹配Skeet的代码。换句话说,不要这样做:_singletonistance=_singletonistance??(_singletonistance=newfacebookservice());