1

我正在为 Xamarin Forms 开设一门 MVVM 课程,一个班级的老师使用 FreshIOC.Container.Register 来“注册不同的实例或依赖项”,我不明白这对我的代码有何影响,如果有人能解释一下我会很感激的。

我的代码为例:

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 类。顺便说一句,还有另一种方法称为“解决”而不是“注册”,如果您也能解释一下,我将不胜感激。

就是这样,如果您需要我的代码中的更多内容,我会在看到您的请求后立即提供,非常感谢大家的宝贵时间,祝您有美好的一天。

4

1 回答 1

2

RegisterIoC 框架中注册您的具体类。

因此,简而言之,IoC 将像这样工作:

new ContactService您将要求 IoC 框架给您一个,而不是一直在做。

这有一些好处;

  • 因为你经常通过接口注册,你只需要在一个地方担心ContractService构造函数,而不是到处担心。
  • 它使您的代码更好地可测试,因为消费页面不负责创建服务。这听起来可能有点神秘,但是如果您编写单元测试,您会立即看到好处。

注册是做什么的?

它确保您可以从 IoC 框架请求此服务。

第一个注册ContactServiceIContactService; 因此,如果您请求 an,IContactService您将获得已注册的类型。

第二个注册一个类型的实例:如果你请求它,你总是会得到那个实例。适用于设置和线程安全的东西。根本不适用于与数据库相关的事物。

解决是做什么的?

它使您能够从 IoC 框架中检索服务,但请注意:可能有更好的方法,例如通过构造函数注入。


此代码是构造函数注入的示例:通过注册IContactService您已经启用了自动解析服务的可能性。如果您忽略注册,这是不可能的:

public MainViewModel(IContactService Service, IUserDialogs Dialog)
{
   service = Service;
   dialog = Dialog;
}

如果您不使用 IoC 框架,那么您最终会new ContactService在您使用的每个模型中使用,这可以被视为此类服务的反模式,因为;

  • 更改实现具体类型将导致大量代码更改。
  • 更改构造函数会导致大量代码更改
  • 对消费者进行单元测试会导致服务实例化,这可能会导致副作用。
于 2020-01-04T13:30:48.870 回答