C# 尝试使用引用另一个单例的我的单例

C# 尝试使用引用另一个单例的我的单例,c#,C#,我正在调用我创建的自定义工厂(PhotoServiceFactory),它是一个单例,允许我返回特定的自定义服务类型(在本例中为FacebookService)。FacebookService也是一种单例服务。在FacebookService中,我通过属性公开了FacebookAlbumPhoto的一个实例。我这样做是因为我不必一次又一次地使用大量相同的代码来创建FacebookAlbumPhoto的新实例……我可以使用FacebookService的属性获得一个实例 PhotoServiceF

我正在调用我创建的自定义工厂(PhotoServiceFactory),它是一个单例,允许我返回特定的自定义服务类型(在本例中为FacebookService)。FacebookService也是一种单例服务。在FacebookService中,我通过属性公开了FacebookAlbumPhoto的一个实例。我这样做是因为我不必一次又一次地使用大量相同的代码来创建FacebookAlbumPhoto的新实例……我可以使用FacebookService的属性获得一个实例

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());