MVVM Light SimpleIoC поддерживает синглтоны? - PullRequest
10 голосов
/ 04 сентября 2011

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

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

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

Ответы [ 2 ]

27 голосов
/ 05 сентября 2011

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

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

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

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

1 голос
/ 05 сентября 2011

Я использую 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));
            }
        }
}
...