gpt4 book ai didi

c# - ReactiveUI 依赖注入(inject)构造器

转载 作者:太空狗 更新时间:2023-10-30 01:02:43 25 4
gpt4 key购买 nike

我在 ReactiveUI 中使用内置的依赖注入(inject)器/splat 注入(inject)器。

我有构造函数,我想在其中传递适用的数据存储库。

在其他框架中,它只是对接口(interface)使用反射,并使用 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 框架做任何不明显的事情,它已经提供了。我意识到执行上述操作会产生性能成本,并且可能会使用表达式树编译表达式来避免每次反射成本或其他事情。

感谢您的帮助,格伦

最佳答案

Splat 依赖解析器(服务注册表)是非常基本的开箱即用,它不提供依赖注入(inject) (DI)。

但是如果你喜欢 DI(不是每个人都喜欢,因为它可以隐藏依赖性和设计的复杂性,有些人更愿意感受它的痛苦以更好地避免它),你可以像刚才那样轻松地将 DI 插入其中。

尽管对您的 impl 有一个评论,但我建议您延迟对 GetService 的实际调用直到创建对象(以防您的服务注册表内容随时间变化,并避免强制 Register 排序),例如:

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


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

关于c# - ReactiveUI 依赖注入(inject)构造器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32647389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com