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 コンパイル式を使用して、毎回または何かのリフレクション コストを回避できます。
助けてくれてありがとう、グレン