Формы Xamarin: IOC в FreshMvvm

Я использую Freshmvvm для своего проекта форм Xamarin. Я использую камеру и хочу использовать функции платформы. Итак, мне было интересно, как я могу использовать элементы управления IOC для использования функции, специфичной для платформы.

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

Если я вызываю этот код из класса App, нужно ли мне иметь класс камеры в проектах iOS и Android, если да, то как сообщить классу приложения, что мы хотим реализовать класс камеры для одной конкретной платформы? или есть лучший способ использовать управление IOC и внедрить интерфейсы в конструкторы моделей страниц (модели просмотра), когда мы хотим его использовать?


person TheDeveloper    schedule 14.09.2016    source источник


Ответы (3)


Я думаю, что вам нужна служба зависимостей. Это позволяет вам получить доступ к встроенной функции.

Таким образом, вам нужно создать интерфейс в вашем общем коде, например ICamera.

public interface ICamera
{
   void TakePicture();
}

Теперь вы можете реализовать этот интерфейс в проектах для конкретных платформ.

Например, на iOS вы можете реализовать это так:

открытый класс CameraImplementation: ICamera {public void TakePicture () {// здесь код iOS}}

Ключевым моментом здесь является то, как вы это регистрируете. Вы можете сделать это, добавив такой тег над пространством имен конкретной реализации платформы, например:

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

То же самое и с Android. Если вы сохраните название, вы даже можете скопировать и вставить этот тег.

person Gerald Versluis    schedule 14.09.2016
comment
Это то, что я ищу. Спасибо. - person TheDeveloper; 14.09.2016
comment
DependencyService по умолчанию сохраняет его как синглтон, но с FreshMVVM иногда создает новый экземпляр. Есть идеи, почему и как сохранить экземпляр? - person Dpedrinha; 18.08.2017

Отказ от ответственности: я новичок в IOC, DI и FreshMvvm. Просто заставил это работать для себя и хотел поделиться, чтобы помочь другим, на случай, если они наткнутся на этот форум, как я.

DependencyService, предоставляемый Xamarin. Forms - это фантастика, но все же ограниченная (например, не может реализовать внедрение конструктора). Также может возникнуть проблема с внедрением модульного тестирования при использовании DependencyService. Вот руководство, которое проведет вас через некоторые шаги, если вы настаивают на использовании DependencyService, но также хотят провести модульное тестирование вашего кода. Это локатор служб, который (на мой взгляд) сложнее протестировать, чем внедрение зависимостей.

Вместо этого я просто использовал IOC FreshMvvm для доступа к коду конкретной платформы. Все, что сказал @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”);
    }   
}

Обязательно зарегистрируйте класс для конкретной платформы перед загрузкой приложения:

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

return base.FinishedLaunching(app, options);

Мне пришлось это сделать, потому что я разрешаю свой MainPageModel в конструкторе своего App.xaml.cs:

public App()
    {
        InitializeComponent();

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

@WickedW полностью соответствовал конкретной платформе реализации, тогда я просто использовал FreshMvvm n = 2 видео, чтобы выяснить, как внедрить конструктор, потому что это была функция, которая мне была нужна лично. Надеюсь, это поможет людям, которые изо всех сил пытались понять это, как я ????.

person MedievalCoder    schedule 19.03.2019

DependencyService, встроенный в Xamarin Forms, будет делать бизнес, но если вы хотите использовать ТОЛЬКО IOC в FreshMvvm, вы можете -

a) зарегистрируйте свой класс (классы) для конкретной платформы рядом с методом Forms Init (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>();
}

с вашим классом, существующим на стороне платформы, как обычно -

public class FileHelper : IFileHelper
{
    public string GetLocalFilePath(string filename)
    {
        string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

а затем разрешите этот класс при использовании его в своем проекте PCL / Forms -

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

...
person WickedW    schedule 26.09.2017