Xamarin Forms:FreshMvvm 中的 IOC
Xamarin Forms: IOC in FreshMvvm
我正在为我的 Xamarin 表单项目使用 Freshmvvm。我正在使用相机并想使用特定于平台的功能。所以,我想知道如何使用 IOC 控件来使用特定于平台的功能。
Freshmvvm.FreshIOC.Container.Register<ICamera,Camera>();
如果我从 App class 调用此代码,我是否需要在 iOS 和 Android 项目中都安装摄像头 class,如果是,那么如何让应用 class 知道我们要实现一个特定平台的相机 class?或者有没有更好的方法来使用 IOC 控件并在我们想要使用它时将接口注入页面模型(视图模型)的构造函数?
我想你想要的是Dependency Service。这使您能够访问本机功能。
这样你必须在共享代码中创建一个接口,例如 ICamera
。
public interface ICamera
{
void TakePicture();
}
现在您可以在特定于平台的项目中实现此接口。
例如在 iOS 你可以这样实现它:
public class 相机实现:ICamera
{
public void TakePicture()
{
// iOS 代码在这里
}
}
现在的关键是你如何注册它。您可以通过在平台特定实现的名称空间 上方添加这样的标签来实现此目的 ,如下所示:
[assembly: Xamarin.Forms.Dependency (typeof (CameraImplementation))]
namespace yourapp
{
// CameraImplementation class here
}
Android也是如此。如果您保持命名不变,您甚至可以复制并粘贴此标签。
Xamarin Forms 中内置的 DependencyService 可以完成这项业务,但如果您只想在 FreshMvvm 中使用 IOC,您可以 -
a) 在 Forms Init 方法附近注册您的平台特定 class(es)(IOS 后跟)-
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
InitIoc();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
private void InitIoc()
{
FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
}
你的 class 照常存在于平台端 -
public class FileHelper : IFileHelper
{
public string GetLocalFilePath(string filename)
{
string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
然后在 PCL / Forms 项目中使用它时解决 class -
IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
...
免责声明:我对 IOC、DI 和 FreshMvvm 很陌生。刚刚让这个为我自己工作,并想分享以帮助其他人,以防他们像我一样偶然发现这个论坛。
DependencyService provided by Xamarin Forms is fantastic, yet still limited (e.g. cannot implement constructor injection). It also can become a bit of a hassle to implement Unit Testing while making use of DependencyService. Here 是一个教程,如果您坚持使用 DependencyService 但又想对代码进行单元测试,它将带您完成一些步骤。它是一个服务定位器,(在我看来)比依赖注入更难测试。
我没有使用它,而是使用 FreshMvvm 的 IOC 来访问特定于平台的代码。 @WickedW 所说的一切都是完全正确的。我只是稍微调整了最后一步。
而不是直接解析依赖关系:
IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
我使用构造函数注入:
Public class MainPageModel : FreshBasePageModel
{
public string YourLabelText { get; set;}
IFileHelper _fileHelper;
public MainPageModel(IFileHelper fileHelper)
{
_fileHelper = fileHelper
}
// This is implemented by FreshBasePageModel
public override void Init(object initData)
{
YourLabelText = _fileHelper.GetLocalFilePath(“CoreSQLite.db3”);
}
}
确保在加载应用程序之前注册您的特定平台class:
FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
我必须这样做,因为我在 App.xaml.cs:
的构造函数中解析了 MainPageModel
public App()
{
InitializeComponent();
var page = FreshPageModelResolver.ResolvePageModel<MainPageModel>();
var navContainer = new FreshNavigationContainer(page);
MainPage = navContainer;
}
@WickedW 完全正确地实现了特定于平台的实现,然后我只是使用 Michael Ridland 的 FreshMvvm n=2 视频来弄清楚构造函数注入,因为这是我个人需要的功能。希望这能帮助像我一样努力解决这个问题的人。
我正在为我的 Xamarin 表单项目使用 Freshmvvm。我正在使用相机并想使用特定于平台的功能。所以,我想知道如何使用 IOC 控件来使用特定于平台的功能。
Freshmvvm.FreshIOC.Container.Register<ICamera,Camera>();
如果我从 App class 调用此代码,我是否需要在 iOS 和 Android 项目中都安装摄像头 class,如果是,那么如何让应用 class 知道我们要实现一个特定平台的相机 class?或者有没有更好的方法来使用 IOC 控件并在我们想要使用它时将接口注入页面模型(视图模型)的构造函数?
我想你想要的是Dependency Service。这使您能够访问本机功能。
这样你必须在共享代码中创建一个接口,例如 ICamera
。
public interface ICamera
{
void TakePicture();
}
现在您可以在特定于平台的项目中实现此接口。
例如在 iOS 你可以这样实现它:
public class 相机实现:ICamera { public void TakePicture() { // iOS 代码在这里 } }
现在的关键是你如何注册它。您可以通过在平台特定实现的名称空间 上方添加这样的标签来实现此目的 ,如下所示:
[assembly: Xamarin.Forms.Dependency (typeof (CameraImplementation))]
namespace yourapp
{
// CameraImplementation class here
}
Android也是如此。如果您保持命名不变,您甚至可以复制并粘贴此标签。
Xamarin Forms 中内置的 DependencyService 可以完成这项业务,但如果您只想在 FreshMvvm 中使用 IOC,您可以 -
a) 在 Forms Init 方法附近注册您的平台特定 class(es)(IOS 后跟)-
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
InitIoc();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
private void InitIoc()
{
FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
}
你的 class 照常存在于平台端 -
public class FileHelper : IFileHelper
{
public string GetLocalFilePath(string filename)
{
string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
然后在 PCL / Forms 项目中使用它时解决 class -
IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
...
免责声明:我对 IOC、DI 和 FreshMvvm 很陌生。刚刚让这个为我自己工作,并想分享以帮助其他人,以防他们像我一样偶然发现这个论坛。
DependencyService provided by Xamarin Forms is fantastic, yet still limited (e.g. cannot implement constructor injection). It also can become a bit of a hassle to implement Unit Testing while making use of DependencyService. Here 是一个教程,如果您坚持使用 DependencyService 但又想对代码进行单元测试,它将带您完成一些步骤。它是一个服务定位器,(在我看来)比依赖注入更难测试。
我没有使用它,而是使用 FreshMvvm 的 IOC 来访问特定于平台的代码。 @WickedW 所说的一切都是完全正确的。我只是稍微调整了最后一步。
而不是直接解析依赖关系:
IFileHelper fileHelper = FreshMvvm.FreshIOC.Container.Resolve<IFileHelper>();
string dbPath = fileHelper.GetLocalFilePath("CoreSQLite.db3");
我使用构造函数注入:
Public class MainPageModel : FreshBasePageModel
{
public string YourLabelText { get; set;}
IFileHelper _fileHelper;
public MainPageModel(IFileHelper fileHelper)
{
_fileHelper = fileHelper
}
// This is implemented by FreshBasePageModel
public override void Init(object initData)
{
YourLabelText = _fileHelper.GetLocalFilePath(“CoreSQLite.db3”);
}
}
确保在加载应用程序之前注册您的特定平台class:
FreshMvvm.FreshIOC.Container.Register<IFileHelper, FileHelper>();
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
我必须这样做,因为我在 App.xaml.cs:
的构造函数中解析了 MainPageModelpublic App()
{
InitializeComponent();
var page = FreshPageModelResolver.ResolvePageModel<MainPageModel>();
var navContainer = new FreshNavigationContainer(page);
MainPage = navContainer;
}
@WickedW 完全正确地实现了特定于平台的实现,然后我只是使用 Michael Ridland 的 FreshMvvm n=2 视频来弄清楚构造函数注入,因为这是我个人需要的功能。希望这能帮助像我一样努力解决这个问题的人。