2011-09-04 16 views
10

Używam SterlingDB w moim bieżącym projekcie Windows Phone i chciałbym móc przetworzyć bazę danych Sterling z różnych miejsc w mojej aplikacji przy użyciu nowego kontenera SimpleIoC w MVVM Light v4.Czy MVVM Light SimpleIoC obsługuje single?

Jednak nie jestem pewien, czy SimpleIoC obsługuje rejestrowanie singletonów. Silnik SterlingDB powinien być tworzony tylko wtedy, gdy aplikacja jest uruchamiana po raz pierwszy, a ja nie chcę obracać nowych instancji za każdym razem, gdy kontener wstrzykuje odniesienie do niego.

Jeśli jest inny sposób, powinienem pomyśleć o tym problemie, chętnie skorzystam również z alternatywnych rozwiązań.

Odpowiedz

27

SimpleIoc zwraca instancje na podstawie klucza, który do niego przekazujesz. Jeśli wywołasz GetInstance() bez klucza, zawsze otrzymasz domyślną instancję obiektu. Instancja jest tworzona tylko wtedy, gdy wywołujesz GetInstance po raz pierwszy (leniwe tworzenie). Jeśli wywołasz GetInstance za pomocą klucza, sprawdzam, czy to nazwane wystąpienie już istnieje w rejestrze. Jeśli jeszcze nie, tworzę go, a następnie zwracam. Jeśli istnieje już instancja z tym kluczem, po prostu zwracam.

W wersji alfa (BL16 MIX edition) występuje błąd, który spowodował, że Register utworzył instancję zbyt wcześnie, kiedy użyto klucza. Ten błąd został naprawiony w wersji beta beta 1, którą opublikuję w tym tygodniu.

Tak, jak widzisz, otrzymasz tę samą instancję z SimpleIoc, jeśli zawsze używasz tego samego klucza (lub po prostu domyślnej instancji, jeśli w ogóle nie używasz klucza).

Czy ma to sens? Laurent

+0

Miałem nadzieję, że odpowiesz na to ... ;-). Domyślam się, że działało w ten sposób, ale nie dostałem odpowiedzi na to pytanie. – AxelEckenberger

+0

Dzięki, Laurent. To ma wiele sensu. Zbliżam się do tego, że mogę sam odpowiedzieć na te pytania, patrząc tylko na kod, ale nie jestem jeszcze na miejscu. Doceń pomoc, jak zawsze. –

1

Używam Sterling w moim normalnym projekcie silverlight i wszystko co robię jest dodanie tego do App.xaml ..

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

wspólne referencje SterlingService.cs porządku skopiowane z przykładów .. zaczyna się jak to

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

} 

później ja właśnie utworzony otoki wokół tej usługi jak soo .. i po prostu zadzwonić SterlingService gdzie zawsze muszę odwołać usługę jak tak ... Nadzieję, że to pomaga.

[ExportService(ServiceType.Runtime, typeof(IOffLineDataService))] 
    public sealed class OfflineDataService : IOffLineDataService 
    { 
     User user = WebContext.Current.User; 

     public OfflineDataService() 
     { 

     } 


     public void PurgeAll(Action<Exception> callback) 
     { 
      try 
      { 
       SterlingService.Current.Database.Purge(); 
       callback(null); 
      } 
      catch (Exception ex) 
      { 
       Error.LogError(ex, user); 
       callback(new Exception(ErrorMessages.OfflinePurgeAll)); 
      } 
     } 
} 
Powiązane problemy