2014-03-19 4 views
1

내 Windows Phone 8 응용 프로그램에서 페이지 간 데이터 (complexe 데이터)를 공유하려면 싱글 톤을 구현하고 싶지만 일반적으로 사용하고 싶습니다. 각 유형에 대한 새로운 인스턴스를 생성한다고 생각하지 않습니까?일반 싱글 톤 및 페이지간에 데이터 공유

public sealed class NavigationContextService<T> 
{ 
    private static readonly NavigationContextService<T> instance = new NavigationContextService<T>(); 
    private NavigationContextService() 
    { 
    } 
    public static NavigationContextService<T> Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 

    public List<T> ShareList { get; set; } 
    public T ShareData { get; set; } 
} 
+0

작동해야합니다. 시도해 보셨습니까? – Romasz

+0

예, 작동하지만 모든 유형에 대해 새 인스턴스를 만들고 싱글 톤에는 인스턴스가 하나만 있어야합니다. – Sam

+0

이렇게 단순한 작업을 수행해야하는 이유가 있습니까? App.cs에 데이터가있는 개체를 넣고 App.Current.xxxx를 통해 액세스하십시오. – crea7or

답변

0

그것은 모든 유형의 새로운 인스턴스를 만드는 것이 일반적이기 때문에 - 당신이 제네릭으로 시작하는 경우, 일부 자습서, 블로그 나 MSDN 살펴보고 (이 같이되고 싶어 - 당신은 쉽게 것입니다 인터넷에서 많은 것을 찾으십시오).

여전히 싱글 톤입니다. 사용시

NavigationContextService<string>.Instance.ShareList.Add("Text"); 

string 인스턴스가 하나 있습니다. generics는 유형이 다른 동일한 메소드/클래스를 작성하려는 경우 많은 도움이됩니다.

한편

당신은 예를 들어 같은 비 일반으로 클래스를 수정할 수 있습니다 후 다른 유형을 개최 싱글 만들려면 : 당신은 내가 위의 코드에서 볼 수 있듯이

public sealed class NavigationContextServiceNonGeneric 
{ 
    private static readonly NavigationContextServiceNonGeneric instance = new NavigationContextServiceNonGeneric(); 
    private NavigationContextServiceNonGeneric() { ShareList = new List<object>(); } 

    public static NavigationContextServiceNonGeneric Instance 
    { get { return instance; } } 

    public List<object> ShareList { get; set; } 
    public object ShareData { get; set; } 
} 

을 공유 데이터의 '정확한'유형을 정의하지 않았습니다. 유형은 object입니다. 그럼 당신은 쉽게와 함께 대부분의 데이터를 저장할 수 있습니다 : 그것은 공유 다양한 유형의 데이터를 보유 할 수 싱글이다

NavigationContextServiceNonGeneric.Instance.ShareList.Add("Text"); 
NavigationContextServiceNonGeneric.Instance.ShareList.Add(3); 
NavigationContextServiceNonGeneric.Instance.ShareList.Add(3.0f); 

. BUT 그것은 또한 disavantages있다 - 당신이 어떤 종류의 데이터를 보유하고 어떤 순서로 기억 해야하는 것이 중요합니다. 제 생각에는 Generic 버전이 그 사실 때문에 더 낫습니다.

모든 것은 코드 목적에 따라 다릅니다. 이 두 가지 접근 방식이 더 쉽고 편리 할 수 ​​있습니다. 페이지 탐색에 관해서는


, 당신은 예를 들어 this article에서 방법을 사용하려고 할 수 있습니다 - 당신은 개체를 전달하는 네비게이션 서비스를 확장 : 다음

public static class Extensions 
{ 
    private static object Data; 

    public static void Navigate(this NavigationService navigationService, Uri source, object data) 
    { 
    Data = data; 
    navigationService.Navigate(source); 
    } 

    public static object GetNavigationData(this NavigationService service) { return Data; } 
} 

을 당신이 그것을 사용

NavigationService.Navigate(yourUri, DataToPass); 

탐색 후 데이터를 얻을 수 있습니다.

string myTextData = NavigationService.GetNavigationData() as string; 

이 방법은 단점이 있습니다. 유형이 안전하지 않으며 삭제 표시 모드에서 데이터가 보존되지 않습니다. 그런 다음

PhoneApplicationService.Current.State.Add("data", yourData); 

당신이 당신의 데이터를 얻으려면 : -

쉽게 페이지 탐색하기위한 목적으로 PhoneApplicationService.State Property를 사용할 수있는 두 번째 단점에 관해서는

그것은 (삭제 표시하면서 보존) 사전입니다

yourDataType yourData = PhoneApplicationService.Current.State["data"] as yourDataType; 

데이터를 전달할 수있는 다양한 방법이 있습니다.

+0

내 목적은 기본적으로 페이지간에 데이터를 전송하고 메모리와 같은 일부 데이터를 캐시와 같이 사용하는 것입니다. – Sam

+0

@Samissa 탐색을 통해 데이터를 전달하는 것에 대한 약간의 대답을 확장했습니다. 도움이 될만한 몇 가지 추가 정보가 있습니다. 데이터를 전달하는 방법에는 여러 가지가 있습니다. 여기서 다룬 모든 방법이 효과가 있습니다. – Romasz