c# - "FreshIOC.Container.Register"有什么作用?

标签 c# mvvm xamarin.forms ioc-container freshmvvm

我正在为 Xamarin Forms 开设一门 MVVM 类(class),一个类(class)的老师使用 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 类。顺便说一句,还有另一种方法称为“解决”而不是“注册”,如果您也能解释一下,我将不胜感激。

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

最佳答案

Register在 IoC 框架中注册您的具体类。

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

而不是制作new ContactService一直以来,你都会要求 IoC 框架给你一个。

这有一些好处;

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

  • what does Register do?



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

    第一个注册 ContactService作为 IContactService ;所以,如果您请求 IContactService你会得到注册的类型。

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

    What does Resolve do?



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

    此代码是构造函数注入(inject)的示例:通过注册 IContactService您已启用自动解析服务的可能性。如果您忽略注册,这是不可能的:
    public MainViewModel(IContactService Service, IUserDialogs Dialog)
    {
       service = Service;
       dialog = Dialog;
    }
    

    如果你没有使用 IoC 框架,你最终会得到 new ContactService在您使用的每个模型中,可以将其视为此类服务的反模式,因为;
  • 更改实现具体类型将导致大量代码更改。
  • 更改构造函数会导致大量代码更改
  • 对消费者进行单元测试会导致服务实例化,这可能会导致副作用。
  • 关于c# - "FreshIOC.Container.Register"有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59591097/

    相关文章:

    c# - 为什么 AuthenticationResult B2C 认证中 accessToken 为空?

    c# - Xamarin 为条形图创建 OxyPlot

    c# - lambda 表达式中的事件 - C# 编译器错误?

    c# - 按字母顺序对动态下拉列表进行排序

    c# - Blazor 将 EventCallback 作为类属性传递给组件

    wpf - MVVM 和 UniformGrid 的数据绑定(bind)

    c# - IEnumerable OrderBy

    wpf - 如何保持用户控制?

    c# - 将列表中类的属性从 ObservableCollection 绑定(bind)到数据网格

    c# - Xamarin.Forms - 与单击事件中的事件类型错误不匹配