[英]Inversion of Control (IOC) in FreshMvvm
关于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);
}
为什么我们需要注册接口,如果没有注册那么真正的实现呢? 实施这一原则是否有任何好处。 这篇文章我跟随。
如果您已经在Xamarin.Forms中使用了DependencySerices,那么您已经完成了大部分工作。 从Xamarin.Forms的角度解释
假设您的ContentPage
需要一个Network
类来检查是否存在网络连接,传统的方法是使用new
关键字并获取实例,以便您可以调用其方法。
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() { ... }
}
如果您已注册所有依赖项,Container将负责依赖关系图并为您解决它们。 如果Container无法解析图形,可能是因为您没有注册或者可能是循环依赖,它会抛出异常。
这似乎完全没必要,但随着你的应用程序的增长,MVVM加上DI可以更强大,更容易开发。
我所解释的只是DI的一小部分,你可以在这个很棒的Martin Fowler帖子中阅读更多关于IoC和DI 的内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.