SimpleInjectorをIoCコンテナーとして使用しています。私は、単一の汎用インターフェースのために、いくつかの(おそらく間違った用語を使用してすみません)部分的に閉じた実装を開発しました。
ジェネリックインターフェイスをリクエストできるようになり、提供されたタイプに基づいて、SimpleInjectorに正しいクラス実装を返してもらいたいと思います。(間違って実行すると実装が重複する可能性があるため、これはノーノーかもしれないことは理解できますが、それでも実行できるかどうかを知りたいです。)
以下のコードスニペットに基づいて、Simple Injectorを構成してインスタンスを返すにはどうすればよいITrim<Ford, Green>
ですか?
共通基本クラス層:
public interface IColour { }
public interface IVehicle { }
public interface ITrim<TVehicle, TColour>
where TVehicle : IVehicle
where TColour : IColour
{
void Trim(TVehicle vehicle, TColour colour);
}
public abstract class TrimVehicle<TVehicle, TColour> : ITrim<TVehicle, TColour>
where TVehicle : IVehicle
where TColour : IColour
{
public virtual void Trim(TVehicle vehicle, TColour colour) { }
}
中間層、車両のタイプに共通のコードを提供します。
public abstract class Green : IColour { }
public abstract class Blue : IColour { }
public abstract class Car : IVehicle { }
public abstract class Bike : IVehicle { }
public abstract class TrimCar<TCar, TColour> : TrimVehicle<TCar, TColour>
where TCar : Car
where TColour : IColour
{
public override void Trim(TVehicle vehicle, TColour colour)
{
base.Trim(vehicle, colour);
}
}
public abstract class TrimBike<TBike, TColour> : TrimVehicle<TBike, TColour>
where TBike : Bike
where TColour : IColour
{
public override void Trim(TVehicle vehicle, TColour colour)
{
base.Trim(vehicle, colour);
}
}
より具体的な実装を提供する最終層:
public class Ford : Car { }
public class TrimFord<TFord, TColour> : TrimCar<TFord, TColour>
where TFord : Ford
where TColour : IColour
{
public override void Trim(TVehicle vehicle, TColour colour)
{
base.Trim(vehicle, colour);
}
}
public class Yamaha : Bike { }
public class TrimYamaha<TYamaha, TColour> : TrimBike<TYamaha, TColour>
where TYamaha : Yamaha
where TColour : IColour
{
public override void Trim(TVehicle vehicle, TColour colour)
{
base.Trim(vehicle, colour);
}
}