我在 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 框架做任何不明显的事情,并且它已经提供。我意识到执行上述操作会产生性能成本,并且可能会使用表达式树编译的表达式来避免每次或某事的反射成本。
谢谢你的帮助,格伦