2011-09-04 23 views
10

Tôi đang sử dụng SterlingDB trong dự án Windows Phone hiện tại của mình và tôi muốn có thể giải quyết cơ sở dữ liệu Sterling từ nhiều nơi khác nhau trong ứng dụng của tôi bằng cách sử dụng vùng chứa SimpleIoC mới trong MVVM Light v4.MVVM Light SimpleIoC có hỗ trợ đĩa đơn không?

Tuy nhiên, tôi không chắc liệu SimpleIoC có hỗ trợ đăng ký đơn hay không. Động cơ SterlingDB chỉ nên được tạo khi ứng dụng lần đầu tiên khởi chạy và tôi không muốn xoay vòng các phiên bản mới mỗi lần container chứa tham chiếu đến nó.

Nếu có một cách khác nhau tôi nên suy nghĩ về vấn đề này, tôi cũng rất vui khi giải trí các giải pháp thay thế.

Trả lời

27

SimpleIoc trả về các cá thể dựa trên khóa mà bạn chuyển đến. Nếu bạn gọi GetInstance() mà không có khóa, bạn sẽ luôn nhận được cá thể mặc định của đối tượng của bạn. Ví dụ này chỉ được tạo khi bạn gọi GetInstance lần đầu tiên (tạo lười). Nếu bạn gọi GetInstance bằng một khóa, tôi tra cứu nếu cá thể được đặt tên này đã tồn tại trong sổ đăng ký chưa. Nếu nó chưa được, tôi tạo ra nó và sau đó tôi trả lại nó. Nếu có một ví dụ với khóa đó, tôi chỉ trả lại nó.

Trong phiên bản alpha (BL16 MIX edition), có lỗi khiến Đăng ký tạo cá thể quá sớm, khi khóa được sử dụng. Lỗi này được sửa trong bản beta V4 mà tôi sẽ xuất bản trong tuần này.

Vì vậy, như bạn thấy bạn sẽ nhận được cùng một cá thể từ SimpleIoc nếu bạn luôn sử dụng cùng một khóa (hoặc đơn giản là trường hợp mặc định nếu bạn không sử dụng khóa nào cả).

Có hợp lý không? Laurent

+0

Đã hy vọng bạn sẽ trả lời ... ;-). Tôi đoán, rằng nó hoạt động theo cách đó nhưng không nhận được 'vòng trả lời nó WE này. – AxelEckenberger

+0

Cảm ơn, Laurent. Điều đó làm cho rất nhiều ý nghĩa. Tôi đang tiến gần hơn đến việc có thể tự mình trả lời những câu hỏi này chỉ vì nhìn vào mã, nhưng tôi vẫn chưa hoàn toàn ở đó. Đánh giá cao sự trợ giúp, như mọi khi. –

1

Tôi đang sử dụng Sterling trong dự án Silverlight bình thường của tôi và tất cả tôi đang làm là thêm này để App.xaml ..

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

tài liệu tham khảo chung SterlingService.cs tốt i sao chép từ các ví dụ .. Bắt đầu như này

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

} 

sau tôi vừa tạo một wrapper xung quanh dịch vụ này như soo .. và tôi chỉ cần gọi SterlingService nơi nào tôi cần phải tham khảo các dịch vụ như vậy ... Hope this helps.

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