2011-09-04 148 views
10

我在當前的Windows Phone項目中使用SterlingDB,並且希望能夠使用MVVM Light v4中的新SimpleIoC容器從應用程序中的各個位置解析Sterling數據庫。MVVM Light SimpleIoC是否支持單例?

但是,我不確定SimpleIoC是否支持註冊單例。 SterlingDB引擎只能在應用程序第一次啓動時創建,並且我不想在每次容器注入引用時都啓動新實例。

如果還有其他方法我應該考慮這個問題,我很樂意接受替代方案。

回答

27

SimpleIoc根據您傳遞給它的密鑰返回實例。如果您在不使用密鑰的情況下調用GetInstance(),則將始終獲取對象的默認實例。該實例僅在第一次調用GetInstance時創建(延遲創建)。如果您使用密鑰調用GetInstance,則查找註冊表中是否存在此已命名的實例。如果它還沒有,我創建它,然後我將它返回。如果已經有一個關鍵的實例,我只是返回它。

在alpha版本(BL16 MIX版本)中,有一個錯誤導致Register在使用密鑰時過早創建實例。這個錯誤修復了我將在本週發佈的V4 beta1。

因此,如你所見,如果你總是使用相同的密鑰(或者只是默認實例,如果你根本不使用密鑰的話),你將從SimpleIoc中獲得相同的實例。

是否有意義? Laurent

+0

希望你能回答這個問題...... ;-)。我猜想,它是這樣工作的,但是沒有完全回答這個WE。 – AxelEckenberger

+0

謝謝,洛朗。這很有道理。我越來越接近能夠通過查看代碼自己回答這些問題,但我還沒有完成。一如既往地欣賞援助。 –

1

我使用英鎊在我的正常Silverlight項目和所有我做的是加入這App.xaml中..

<Application.ApplicationLifetimeObjects> 
     <common:SterlingService /> 
     <appServices:WebContext> 
      <appServices:WebContext.Authentication> 
       <!--<appsvc:FormsAuthentication/>--> 
       <appsvc:WindowsAuthentication /> 
      </appServices:WebContext.Authentication> 
     </appServices:WebContext> 
    </Application.ApplicationLifetimeObjects> 

共同引用罰款我從例子中複製的SterlingService.cs ..像啓動這

namespace Common 
{ 
     public sealed class SterlingService : IApplicationService, IApplicationLifetimeAware, IDisposable 
     { 
      public const long KILOBYTE = 1024; 
      public const long MEGABYTE = 1024 * KILOBYTE; 
      public const long QUOTA = 100 * MEGABYTE; 

      private SterlingEngine _engine; 
      private static readonly ISterlingDriver _driver = new IsolatedStorageDriver(); // could use this: new MemoryDriver(); 

      public static SterlingService Current { get; private set; } 

} 

後,我剛剛創建周圍像洙這項服務的包裝..我只是叫SterlingService在以往任何時候我需要引用的服務是這樣的...希望這有助於。

​​