"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,这可以被视为此类服务的反模式,因为;

  • 更改实现具体类型将导致大量代码更改。
  • 更改构造函数会导致大量代码更改
  • 对消费者进行单元测试会导致服务实例化,这可能会导致副作用。