Инверсия контроля (МОК) в FreshMvvm - PullRequest
0 голосов
/ 27 сентября 2018

О IOC, я читаю ниже определение и регистрирую interface, что на самом деле я не могу разобрать

Нам не нужно включать наш собственный контейнер IOC, FreshMvvm поставляется с IOCконтейнер встроенный.Он использует TinyIOC внизу, но с другими именами, чтобы избежать конфликтов.

Регистрация интерфейса с FreshIOC , Если вы видите этот код, При запуске приложения делает эту реализацию

public App()  
{  
    InitializeComponent();  

    //Interface rgistration with FreshIOC  
    FreshIOC.Container.Register<IContactRepository, ContactRepository>();  
    FreshIOC.Container.Register<IValidator, ContactValidator>();  

    //var mainPage = FreshPageModelResolver.ResolvePageModel<AddContactPageModel>();  
    //MainPage = new FreshNavigationContainer(mainPage);  
} 

Зачем нам нужно регистрировать интерфейс, если не регистрировать, что было бы реальной реализацией этого?Есть ли преимущества реализации этого принципа. Эта статья, которой я следую.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Если вы использовали DependencySerices в Xamarin.Forms, вы уже сделали это.Объяснение с точки зрения Xamarin.Forms

Давайте предположим, что вашему ContentPage нужен класс Network для проверки наличия сетевого подключения, традиционный способ сделать это - использовать ключевое слово * 1005 и получитьэкземпляр, так что вы можете вызывать его методы.

public MyContentPage : ContentPage
{
    private Network network;
    public MyContentPage()
    {
        //..
        network = new Network();
    }
}

public Network()
{
    public bool HasConnectivity() { ... }
}

В этом нет ничего плохого, но что если классу Network нужен класс Log внутри него?И MyContentPage также нужен класс Log и класс Dialog?И это нужно сделать на всех ваших 50 других страницах ??Внедрение зависимостей обращается к этим и многим другим!

Вы создаете интерфейс и его реализацию, затем регистрируете их в контейнере.Затем контейнер разрешит все зависимости для вас!

public MyContentPage : ContentPage
{
    private INetwork _network;
    private IDialog _dialog;
    public MyContentPage(INetwork network, IDialog dialog)
    {
        //..
        _network = network;
        _dialog = dialog;
    }
}    

public Network(ILog log)
{
    public bool HasConnectivity() { ... }
}

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

Сначала это кажется совершенно ненужным, но по мере роста вашего приложения MVVMв сочетании с DI может быть более мощным и простым для разработки.

То, что я объяснил, является лишь небольшой частью DI, вы можете прочитать больше о IoC и DI в этой потрясающей публикации Мартина Фаулера

0 голосов
/ 27 сентября 2018

Встроенный контейнер IOC является абстракцией TinyIOC .

Чтобы зарегистрировать тип в контейнере TinyIOC через абстракцию FreshMvvm:

FreshIOC.Container.Register<ISomeInterface, SomeImplementation>();

Toпозже используйте его:

// Gets object of type SomeImplementation
var instanceOfConcreteType = FreshIOC.Container.Resolve<ISomeInterface>();

Это пост, обсуждающий, что такое МОК : Что такое инверсия контроля?

...