c# - 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 的信息
推荐阅读
- react-native - 响应本机与样式化组件的响应行为
- dataframe - 错误的 x 刻度标签 matplotlib
- material-design-in-xaml - Root DialogHost 给出一个空白窗口
- java - 依赖默认字段初始化 - 编程风格不好?
- r - 从多个页面抓取 html 节点
- jquery - 离子范围滑块不适用于中心标签
- javascript - 传递数组以填充数组
- kotlin - 具有多态 kotlinx 序列化的自定义序列化程序
- java - jenkinsfile 中的 docker run 忽略了黄瓜选项,但本地没有
- c++ - 两个错误消息说无法执行因为缺少文件(wxmsw312u_core_vc_custom.dll,wxbase312u_vc_custom.dll)如何解决