ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-ReactiveUI依赖注入构造函数

2019-10-27 23:07:59  阅读:509  来源: 互联网

标签:splat reactiveui c


我在ReactiveUI中使用内置的依赖项注入器/ splat注入器.

我有要传递其适用的数据存储库的构造函数.

在其他框架中,它仅对接口使用反射,并使用GetServices调用来满足那些构造函数要求.例如,目前我具有用于创建类的此辅助程序扩展方法:

    /// <summary>
    /// Helper class for having a object's constructor automatically assigned by a "GetService" request.
    /// </summary>
    /// <param name="resolver">The resolver.</param>
    /// <param name="type">The type to register.</param>
    public static void Register<TConcrete, TInterface>(this IMutableDependencyResolver resolver)
        where TConcrete : class
    {
        var concreteType = typeof(TConcrete);

        // Must be a single constructor
        var constructors = concreteType.GetConstructors().Single();

        IList<object> values = new List<object>();

        foreach (var parameter in constructors.GetParameters())
        {
            if (parameter.ParameterType.IsInterface == false)
            {
                throw new InvalidOperationException($"The type {concreteType.Name} has constructor paramters that are not interfaces.");
            }

            values.Add(resolver.GetService(parameter.ParameterType));
        }

        resolver.Register(() => Activator.CreateInstance(concreteType, values.ToArray()), typeof(TInterface));
    }

之所以使用该帮助器类,是为了避免在AppBootStrapper中执行以下操作:

        dependencyResolver.Register(() => new SetupFlightViewModel(dependencyResolver.GetService<IScreen>(), dependencyResolver.GetService<IFlightsModel>(), dependencyResolver.GetService<IAirportsModel>()), typeof(ISetupFlightViewModel));

只需检查以确保我没有对Splat / ReactiveUI框架做任何明显的事情,并且已经提供了它.我意识到执行上述操作会降低性能,并且可能会使用Expression Tree编译的表达式来避免每次或某些情况下的反射开销.

谢谢你的帮助,
格伦

解决方法:

Splat依赖项解析器(服务注册表)非常简单,开箱即用,并且不提供依赖项注入(DI).

但是,如果您喜欢DI(并不是每个人都喜欢,因为它可以隐藏依赖关系和设计复杂性,某些人会更愿意避免这种痛苦以更好地避免它),您可以像刚才那样轻松地将DI插入其中.

不过,对您的隐含评论之一,我建议您将对GetService的实际调用延迟到创建对象之前(以防您的服务注册表内容随时间变化,并避免强制注册顺序),例如:

var paramType = parameter.ParameterType;
values.Add(() => resolver.GetService(paramType));


... Activator.CreateInstance(concreteType, values.Select(cb => cb()).ToArray()) ...

标签:splat,reactiveui,c
来源: https://codeday.me/bug/20191027/1947937.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有