"FreshIOC.Container.Register" 是做什么的?
What does "FreshIOC.Container.Register" do?
我正在学习 Xamarin Forms 的 MVVM 课程,其中一个 class 的老师使用 FreshIOC.Container.Register 到 "register different instances or dependencies",我不明白这对我的代码有何影响,如果有人能解释一下,我将不胜感激。
以我的代码为例:
public App()
{
InitializeComponent();
FreshIOC.Container.Register<IContactService,ContactService>();
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance);
}
class MainViewModel : FreshBasePageModel
{
private IContactService service;
private IUserDialogs dialog;
public MainViewModel(IContactService Service, IUserDialogs Dialog)
{
service = Service;
dialog = Dialog;
}
public override async void Init(object initData)
{
dialog.ShowLoading();
var tempt = await service.GetData();
Contacts = tempt;
dialog.HideLoading();
}
}
我不明白 FreshIOC.Container.Register 的作用,或者它如何连接到 MainViewModel class。顺便说一下,还有另一种方法叫做 "Resolve" 而不是 "Register",如果你也能解释一下,我将不胜感激。
就是这样,如果您需要我的代码的更多信息,我会在看到您的请求后立即提供,非常感谢您的宝贵时间,祝您愉快。
Register
在 IoC 框架中注册您的具体 类。
所以,简而言之,IoC 将像这样工作:
不用一直new ContactService
,你会要求IoC框架给你一个。
这有一些好处;
- 因为你经常通过接口注册,所以你只需要关心一处的ContractService构造函数,而不是到处都是。
- 它使您的代码更易于测试,因为使用页面不负责创建服务。这听起来可能有点神秘,但如果您编写单元测试,您会立即看到好处。
what does Register do?
它确保您可以从 IoC 框架请求此服务。
第一个将ContactService
注册为IContactService
;因此,如果您请求 IContactService
,您将获得已注册的类型。
第二个注册一个类型的实例:如果你请求它,你总是会得到那个实例。适用于设置和线程安全的东西。对数据库相关的东西根本不起作用。
What does Resolve do?
它使您能够从 IoC 框架中检索服务,但请注意:可能有更好的方法,例如通过构造函数注入。
此代码是构造函数注入的一个示例:通过注册 IContactService
您已经启用了自动解析服务的可能性。如果您省略注册,这是不可能的:
public MainViewModel(IContactService Service, IUserDialogs Dialog)
{
service = Service;
dialog = Dialog;
}
如果您不使用 IoC 框架,那么在您使用的每个模型中都会得到 new ContactService
,这可以被视为此类服务的反模式,因为;
- 更改实现具体类型将导致大量代码更改。
- 更改构造函数会导致大量代码更改
- 对消费者进行单元测试会导致服务实例化,这可能会导致副作用。
我正在学习 Xamarin Forms 的 MVVM 课程,其中一个 class 的老师使用 FreshIOC.Container.Register 到 "register different instances or dependencies",我不明白这对我的代码有何影响,如果有人能解释一下,我将不胜感激。
以我的代码为例:
public App()
{
InitializeComponent();
FreshIOC.Container.Register<IContactService,ContactService>();
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance);
}
class MainViewModel : FreshBasePageModel
{
private IContactService service;
private IUserDialogs dialog;
public MainViewModel(IContactService Service, IUserDialogs Dialog)
{
service = Service;
dialog = Dialog;
}
public override async void Init(object initData)
{
dialog.ShowLoading();
var tempt = await service.GetData();
Contacts = tempt;
dialog.HideLoading();
}
}
我不明白 FreshIOC.Container.Register 的作用,或者它如何连接到 MainViewModel class。顺便说一下,还有另一种方法叫做 "Resolve" 而不是 "Register",如果你也能解释一下,我将不胜感激。
就是这样,如果您需要我的代码的更多信息,我会在看到您的请求后立即提供,非常感谢您的宝贵时间,祝您愉快。
Register
在 IoC 框架中注册您的具体 类。
所以,简而言之,IoC 将像这样工作:
不用一直new ContactService
,你会要求IoC框架给你一个。
这有一些好处;
- 因为你经常通过接口注册,所以你只需要关心一处的ContractService构造函数,而不是到处都是。
- 它使您的代码更易于测试,因为使用页面不负责创建服务。这听起来可能有点神秘,但如果您编写单元测试,您会立即看到好处。
what does Register do?
它确保您可以从 IoC 框架请求此服务。
第一个将ContactService
注册为IContactService
;因此,如果您请求 IContactService
,您将获得已注册的类型。
第二个注册一个类型的实例:如果你请求它,你总是会得到那个实例。适用于设置和线程安全的东西。对数据库相关的东西根本不起作用。
What does Resolve do?
它使您能够从 IoC 框架中检索服务,但请注意:可能有更好的方法,例如通过构造函数注入。
此代码是构造函数注入的一个示例:通过注册 IContactService
您已经启用了自动解析服务的可能性。如果您省略注册,这是不可能的:
public MainViewModel(IContactService Service, IUserDialogs Dialog)
{
service = Service;
dialog = Dialog;
}
如果您不使用 IoC 框架,那么在您使用的每个模型中都会得到 new ContactService
,这可以被视为此类服务的反模式,因为;
- 更改实现具体类型将导致大量代码更改。
- 更改构造函数会导致大量代码更改
- 对消费者进行单元测试会导致服务实例化,这可能会导致副作用。