使用MvvmCross,我创建了一个跨平台的方法来翻译Android和iOS上的字符串,因此我可以在$array2
中使用一个共享的$array1
方法。我的核心项目中有一个共享接口translate()
,在每个平台中,我创建了一个继承自接口的ViewModel
类。因此,我的ILocalizationHelper
现在包含LocalizationHelper
个实例,我可以使用ViewModel
方法。
问题:使用ILocalizationHelper
在Android上翻译字符串,我需要一个Context(Activity)。因此,实例化此translate()
并不简单。目前,我使用GetString()
中的LocalizationHelper
属性解决了这个问题,我可以从我的视图中进行设置。
我的Translator
课程如下:
MvxViewModel
现在我觉得这可能是不好的做法(是吗?)。所以我更喜欢使用ViewModel的构造函数注入我的LocalizationHelper实例。但我不知道如何做到这一点,如果它甚至可能的话:
Fragment
感谢对此最佳做法的任何启示。
答案 0 :(得分:1)
您可以使用针对当前热门IMvxAndroidCurrentTopActivity
注册的Activity
来获取您的Android LocalizationHelper
实施中的活动上下文。
var context = Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity;
答案 1 :(得分:1)
您可以在DependencyContainer中注册ApplicationContext
并将其注入LocalizationHelper
实施中。
如果你必须使用当前的活动上下文,你可以将其注册为Func<Context>
(并在每次调用Translate
时解决它)或者只是执行@ Plac3Hold3r建议的内容并将IMvxAndroidCurrentTopActivity注入你的LocalizationHelper
实施。
答案 2 :(得分:1)
初始化Context
时应设置LocalizationHelper
。我假设这可以被视为一个单身人士,所以最好的地方是来自Android项目中的Setup
类。
覆盖InitializeFirstChance()
并使用Mvx IoC注册单例。然后,您就可以在ViewModel中使用构造函数注入。
由于单例已捕获上下文,因此ViewModel不必担心它。这几乎就是插件的工作原理(虽然Mvx有插件的自动注册)。
public class Setup : MvxAndroidSetup
{
private readonly Context _applicationContext;
public Setup(Context applicationContext) : base(applicationContext)
{
// save copy of application context
_applicationContext = applicationContext;
}
protected override void InitializeFirstChance()
{
base.InitializeFirstChance();
// instantiate and register helper
Mvx.RegisterSingleton<ILocalizationHelper>(new LocalizationHelper(_applicationContext));
}
}
public class MyViewModel : MvxViewModel
{
private readonly ILocalizationHelper _localizationHelper;
// constructor injector of helper singleton
public MyViewModel(ILocalizationHelper localizationHelper)
{
_localizationHelper = localizationHelper;
// you will now be able to use _localizationHelper from the rest of the ViewModel
}
}