【问题标题】:Does the MVVM Light SimpleIoC support singletons?MVVM Light SimpleIoC 是否支持单例?
【发布时间】:2011-09-04 02:11:50
【问题描述】:

我在我当前的 Windows Phone 项目中使用 SterlingDB,我希望能够使用 MVVM Light v4 中的新 SimpleIoC 容器从我的应用程序的各个位置解析 Sterling 数据库。

但是,我不确定 SimpleIoC 是否支持注册单例。 SterlingDB 引擎应该只在应用程序首次启动时创建,我不想在每次容器注入对它的引用时都启动新实例。

如果我应该以不同的方式思考这个问题,我也很乐意接受替代方案。

【问题讨论】:

    标签: windows-phone-7 mvvm-light


    【解决方案1】:

    SimpleIoc 根据您传递给它的键返回实例。如果您在没有键的情况下调用 GetInstance(),您将始终获得对象的默认实例。实例仅在您第一次调用 GetInstance 时创建(延迟创建)。如果您使用键调用 GetInstance,我会查找此命名实例是否已存在于注册表中。如果还没有,我创建它然后我返回它。如果已经有一个带有该键的实例,我就返回它。

    在 alpha 版本(BL16 MIX 版本)中,存在一个错误,导致 Register 在使用密钥时过早创建实例。此错误已在我将在本周发布的 V4 beta1 中修复。

    如您所见,如果您始终使用相同的键(或者如果您根本不使用键,则只是默认实例),您将从 SimpleIoc 获得相同的实例。

    这有意义吗? 洛朗

    【讨论】:

    • 希望你能回答这个问题...... ;-)。我猜想,它是这样工作的,但在这个 WE 中并没有得到全面的回答。
    • 谢谢,劳伦特。这很有意义。我越来越接近能够通过查看代码自己回答这些问题,但我还没有完全做到。一如既往地感谢您的帮助。
    【解决方案2】:

    我在我的普通 silverlight 项目中使用 Sterling,我所做的只是将它添加到 App.xaml..

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

    common 引用了我从示例中复制的 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));
                }
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多