Поддерживает ли MVVM Light SimpleIoC одиночные точки?

Я использую SterlingDB в моем текущем проекте Windows Phone, и я хотел бы иметь возможность разрешать базу данных Sterling из разных мест моего приложения, используя новый контейнер SimpleIoC в MVVM Light v4.

Однако я не уверен, поддерживает ли SimpleIoC регистрацию одиночных чисел. Механизм SterlingDB должен создаваться только при первом запуске приложения, и я не хочу разворачивать новые экземпляры каждый раз, когда контейнер вводит ссылку на него.

Если бы я мог подумать об этой проблеме по-другому, я был бы рад развлечь альтернативы.

Ответ 1

SimpleIoc возвращает экземпляры на основе ключа, который вы передаете ему. Если вы вызываете GetInstance() без ключа, вы всегда будете получать экземпляр по умолчанию вашего объекта. Экземпляр создается только при первом вызове GetInstance (ленивое создание). Если вы вызываете GetInstance с ключом, я ищу, если этот именованный экземпляр уже существует в реестре. Если это еще не сделано, я создаю его, а затем верну его. Если уже есть экземпляр с этим ключом, я просто возвращаю его.

В альфа-версии (версия BL16 MIX) есть ошибка, которая заставила Register создать экземпляр слишком рано, когда был использован ключ. Эта ошибка является исправлением в V4 beta1, который я опубликую на этой неделе.

Итак, как вы видите, вы получите тот же экземпляр из SimpleIoc, если вы всегда используете тот же ключ (или просто экземпляр по умолчанию, если вы вообще не используете ключ).

Имеет ли смысл? Laurent

Ответ 2

Я использую Sterling в своем обычном проекте 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; }

}

позже я просто создал обертку вокруг этой службы, например, soo.. и я просто звоню в SterlingService, где мне когда-либо нужно ссылаться на услугу так... Надеюсь, это поможет.

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