Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin表单:FreshMvvm中的IOC_Mvvm_Xamarin_Xamarin.forms_Freshmvvm - Fatal编程技术网

Xamarin表单:FreshMvvm中的IOC

Xamarin表单:FreshMvvm中的IOC,mvvm,xamarin,xamarin.forms,freshmvvm,Mvvm,Xamarin,Xamarin.forms,Freshmvvm,我正在为我的Xamarin表单项目使用Freshmvvm。我使用的是摄像头,希望使用特定于平台的功能。所以,我想知道如何使用IOC控件来使用特定于平台的功能 Freshmvvm.FreshIOC.Container.Register<ICamera,Camera>(); Freshmvvm.FreshIOC.Container.Register(); 如果我从App类调用此代码,我是否需要在iOS和Android项目中都使用camera类,如果需要,那么如何让App类知道我们想要

我正在为我的Xamarin表单项目使用Freshmvvm。我使用的是摄像头,希望使用特定于平台的功能。所以,我想知道如何使用IOC控件来使用特定于平台的功能

Freshmvvm.FreshIOC.Container.Register<ICamera,Camera>();
Freshmvvm.FreshIOC.Container.Register();

如果我从App类调用此代码,我是否需要在iOS和Android项目中都使用camera类,如果需要,那么如何让App类知道我们想要实现一个特定平台的camera类?或者,当我们想使用IOC控件时,有没有更好的方法来使用IOC控件并将接口注入到页面模型(视图模型)的构造函数中?

我想您想要的是。这使您能够访问本机功能

这样,您必须在共享代码中创建一个接口,例如
ICamera

public interface ICamera
{
   void TakePicture();
}
现在,您可以在特定于平台的项目中实现此接口

例如,在iOS上,您可以这样实现它:

[assembly: Xamarin.Forms.Dependency (typeof (CameraImplementation))]
namespace yourapp
{
   // CameraImplementation class here
}
公共类摄像机实现:ICamera { 公众照片 { //这里是iOS代码 } }

这里的关键是如何注册。您可以通过在特定于平台的实现的命名空间上方添加这样的标记来实现这一点,如下所示:

[assembly: Xamarin.Forms.Dependency (typeof (CameraImplementation))]
namespace yourapp
{
   // CameraImplementation class here
}

Android也是如此。如果您保持命名不变,您甚至可以复制并粘贴此标记。

Xamarin表单中内置的DependencyService将完成此任务,但如果您只想在FreshMvvm中使用IOC,您可以-

a) 在Forms Init方法(IOS如下)附近注册特定于平台的类-

然后在PCL/Forms项目中使用该类时解析该类-

IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");

...
IFILHELPER fileHelper=FreshMvvm.FreshIOC.Container.Resolve();
字符串dbPath=fileHelper.GetLocalFilePath(“CoreSQLite.db3”);
...

免责声明:我对IOC、DI和FreshMvvm非常陌生。只是让这个为我自己工作,并想分享,以帮助其他人在那里,只是以防万一,他们偶然发现这个论坛像我一样

Xamarin表单提供的功能非常出色,但仍然有限(例如,无法实现构造函数注入)。在使用DependencyService的同时实现单元测试也会有点麻烦。如果您坚持使用DependencyService,但又想对代码进行单元测试,那么本教程将引导您完成一些步骤。它是一个服务定位器,在我看来,它比依赖注入更难测试

我没有使用它,而是使用FreshMvvm的IOC来访问特定于平台的代码。@WickedW所说的一切都是完全正确的。我只是稍微调整了最后一步

而不是直接解析依赖项:

IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
在加载应用程序之前,请确保注册特定于平台的类:

FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());

return base.FinishedLaunching(app, options);
FreshMvvm.FreshIOC.Container.Register();
全局::Xamarin.Forms.Forms.Init();
加载应用程序(新应用程序());
返回基地。完成发射(应用程序,选项);
我必须这样做,因为我在App.xaml.cs的构造函数中解析了MainPageModel:

public App()
    {
        InitializeComponent();

        var page = FreshPageModelResolver.ResolvePageModel<MainPageModel>();
        var navContainer = new FreshNavigationContainer(page);
        MainPage = navContainer;
    }
public应用程序()
{
初始化组件();
var page=FreshPageModelResolver.ResolvePageModel();
var navContainer=新的FreshNavigationContainer(第页);
主页=导航容器;
}

@WickedW完全正确地实现了特定于平台的实现,然后我用MichaelRidland的视频来理解构造函数注入,因为这是我个人需要的特性。希望这能帮助像我这样努力想明白这一点的人,这就是我要寻找的。谢谢。默认情况下,DependencyService将其作为一个单例保存,但有时使用FreshMVVM会创建一个新实例。你知道为什么以及如何保存这个实例吗?
FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());

return base.FinishedLaunching(app, options);
public App()
    {
        InitializeComponent();

        var page = FreshPageModelResolver.ResolvePageModel<MainPageModel>();
        var navContainer = new FreshNavigationContainer(page);
        MainPage = navContainer;
    }