2

LoginService在 MvvmCross (Mvx) 插件中定义了一个及其接口。

我的 Mvx 应用程序的核心 PCL 使用这个插件App.cs来注册它,如下所示:

        CreatableTypes(typeof(LoginService).GetTypeInfo().Assembly)
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();

然后它使用一个CustomAppStart类来启动应用程序以确定使用哪个 ViewModel 来启动应用程序:

RegisterAppStart(new CustomAppStart(Mvx.Resolve<ILoginService>()));

将 CustomAppStart 定义为:

        public CustomAppStart(ILoginService loginService)
        {
            _loginService = loginService;
        }

        public void Start(object hint = null)
        {
            if (!_loginService.IsLoggedIn)
            {
                ShowViewModel<LoginViewModel>();
            }
            else
            {
                ShowViewModel<HomeViewModel>();
            }
        }

两部分问题:

  1. 我是否使用正确的语法以及CreatableTypes插件 中定义的语法?RegisterAppStartLoginService

  2. 我知道通过使用RegisterAsLazySingleton()我会在请求时获得 SAME LoginService 实例,但是该实例的生命周期是多少?一旦我在 CustomAppStart 中请求它,该实例的状态是否只保留在内存中供我调用和使用,或者当我的一个 ViewModels 在其构造函数中请求相同的 ILoginService 实例时,Mvx 是否神奇地保存并重新水化其状态?

4

1 回答 1

2

1.你使用的语法CreatableTypes对我来说看起来不错。

当不在内部使用它时App,记录的语法是:

" 当然,您也可以在除 Core 之外的程序集上使用相同类型的注册逻辑 - 例如:

    typeof(Reusable.Helpers.MyHelper).Assembly.CreatableTypes()
        .EndingWith("Helper")
        .AsInterfaces()
        .RegisterAsDynamic();

" 来自https://github.com/slodge/MvvmCross/wiki/Service-Location-and-Inversion-of-Control#bulk-registration-by-convention

CreateableTypes(), EndingWith(), etc are all just fairly short extension methods acting on System.Type - you can see them in IoC/MvxTypeExtensions.cs - e.g.

    public static IEnumerable<Type> CreatableTypes(this Assembly assembly)
    {
        return assembly
            .ExceptionSafeGetTypes()
            .Where(t => !t.IsAbstract)
            .Where(t => t.GetConstructors(BindingFlags.Instance | BindingFlags.Public).Any());
    }

2. The lifecycle of a singleton is that once created it stays in RAM as long as the Application does. The only way to remove it from RAM would be to remove all references to it - including removing the IoC container reference (which could only be done by registering a new implementation in its place).

于 2013-08-27T16:42:10.023 回答