首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreshMvvm中的控制反转

FreshMvvm中的控制反转
EN

Stack Overflow用户
提问于 2018-09-27 07:11:10
回答 2查看 672关注 0票数 3

关于国际奥委会,我读了下面的定义&注册interface,这是我无法理解的。

我们不需要包含我们自己的IOC容器,FreshMvvm附带了内置的IOC容器。它在下面使用TinyIOC,但是使用不同的命名来避免冲突。

接口注册与FreshIOC,如果您看到这段代码,在启动应用程序使此实现

代码语言:javascript
复制
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);  
} 

为什么我们需要注册接口,如果没有注册,它的实际实现是什么?执行这一原则有什么好处吗?下面是的文章。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-19 03:35:24

如果您在DependencySerices中使用过Xamarin.Forms,那么您已经使用了其中的大部分。从Xamarin.Forms的角度进行解释

假设您的ContentPage需要一个Network类来检查是否存在网络连接,传统的方法是使用new关键字并获取实例,这样您就可以调用它的方法。

代码语言:javascript
复制
public MyContentPage : ContentPage
{
    private Network network;
    public MyContentPage()
    {
        //..
        network = new Network();
    }
}

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

这没有什么问题,但是如果Network类需要一个Log类呢?MyContentPage还需要Log类和Dialog类吗?这需要在你的其他50页中完成??依赖注入解决了这些问题以及更多的问题!

创建接口及其实现,然后将它们注册到容器中。然后容器为您解析所有依赖项!

代码语言:javascript
复制
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() { ... }
}

如果您已经注册了所有依赖项,Container将负责处理依赖关系图并为您解析它们。如果容器无法解析图形,可能是因为您没有注册或可能是循环依赖关系,它将抛出异常。

这在一开始似乎是完全没有必要的,但是随着应用程序的发展,MVVM加上DI可以更强大,更容易开发。

我所解释的只是DI的一小部分,您可以在这个伟大的马丁·福勒邮报中了解更多关于伟大的马丁·福勒邮报和DI的内容。

票数 4
EN

Stack Overflow用户

发布于 2018-09-27 08:25:41

内置IOC容器是TinyIOC的抽象。

要通过TinyIOC抽象在FreshMvvm容器中注册类型,请执行以下操作:

代码语言:javascript
复制
FreshIOC.Container.Register<ISomeInterface, SomeImplementation>();

以后使用它:

代码语言:javascript
复制
// Gets object of type SomeImplementation
var instanceOfConcreteType = FreshIOC.Container.Resolve<ISomeInterface>();

这里有一篇文章讨论了国际奥委会是什么:什么是控制反转?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52531402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档