2011-09-04 13 views
10

Estoy usando SterlingDB en mi proyecto actual de Windows Phone, y me gustaría poder resolver la base de datos de Sterling desde varios lugares de mi aplicación utilizando el nuevo contenedor SimpleIoC en MVVM Light v4.¿MVVM Light SimpleIoC admite singletons?

Sin embargo, no estoy seguro de si SimpleIoC admite el registro de singletons. El motor SterlingDB solo se debe crear cuando la aplicación se inicie por primera vez, y no quiero que se generen nuevas instancias cada vez que el contenedor inyecte una referencia a él.

Si hay una manera diferente en que debería pensar en este problema, estaría encantado de tener alternativas también.

Respuesta

27

SimpleIoc devuelve instancias basadas en una clave que le pasa. Si llama a GetInstance() sin una clave, siempre obtendrá la instancia predeterminada de su objeto. La instancia solo se crea cuando llamas a GetInstance por primera vez (creación diferida). Si llama a GetInstance con una clave, busco si esta instancia con nombre ya existe en el registro. Si aún no lo hace, lo creo y luego lo devuelvo. Si ya hay una instancia con esa clave, simplemente la devuelvo.

En la versión alpha (edición BL16 MIX), hay un error que hace que Register cree la instancia demasiado pronto, cuando se usó una clave. Este error es corregido en V4 beta1 que publicaré esta semana.

Como ve, obtendrá la misma instancia de SimpleIoc si siempre usa la misma clave (o simplemente la instancia predeterminada si no usa ninguna tecla).

¿Tiene sentido? Laurent

+0

Esperaba que fuera a responder eso ... ;-). Supuse que funcionaba de esa manera, pero no respondí esto, NOSOTROS. – AxelEckenberger

+0

Gracias, Laurent. Eso tiene mucho sentido. Me estoy acercando cada vez más a la capacidad de responder estas preguntas solo por mirar el código, pero todavía no estoy allí. Apreciar la asistencia, como siempre. –

1

estoy usando Sterling en mi proyecto Silverlight normal y todo lo que estoy haciendo es añadir esto a App.xaml ..

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

referencias comunes los SterlingService.cs bien he copiado de los ejemplos .. empieza como este

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

} 

tarde acabo de crear una envoltura alrededor de este servicio como Soo .. y acabo de llamar SterlingService donde cada vez que necesito para hacer referencia al servicio como así ... Espero que esto ayude.

[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)); 
      } 
     } 
} 
Cuestiones relacionadas