私は.NetでDependencyInjectionを読んで頭を包み込んでいます。私は新しいプロジェクトに取り組んでおり、多くのコードをリファクタリングしていますが、ほとんどの場合、非常にエキサイティングで有望です。私は現在、ファクトリの使用方法を考え出そうとしています (Ninject で - ただし、この時点ではどの IOC コンテナも機能します)。
以下のコードでは、他のコードで水域をテストしていて、コンセプトに満足しています。ただし、コードをリファクタリングするにつれて、これを行うためのクリーンな方法に固執しています。ご覧のとおり、多くの重複があります。また、ファクトリを IOC コンテナー内に格納する必要があるかどうか (およびこれを行う方法がわからない) か、CompositionRoot の外で作成を行ってもよいかどうかもわかりません。他のコードはこのレベルで型を区別することに依存しているため、保持する唯一の重要なことは MeasurementTypes 列挙型です。
誰かが私を正しい方向に向けることができますか? 私はオンラインで調べましたが、明らかにすべてをうまくまとめていません。
public enum MeasurementTypes
{
Position,
Distance,
Altitude,
Velocity,
Clock
}
public enum VelocityTypes
{
[Description("meters / second")]
MetersPerSecond,
[Description("knots")]
Knots
}
public enum DistanceTypes
{
[Description("meters")]
Meters,
[Description("Nautical Miles")]
NauticalMiles,
[Description("Statute Miles")]
StatuteMiles
}
public class UnitOfMeasurementFactory
{
public static UnitOfMeasurement CreateUnitOfMeasurement(Enum type, string name = "anonymous", double value = 0)
{
if (type is VelocityTypes)
{
return VelocityUnitOfMeasurementFactory.CreateVelocityUnitOfMeasurement((VelocityTypes)type, name, value);
}
else if (type is DistanceTypes)
{
return DistanceUnitOfMeasurementFactory.CreateDistanceUnitOfMeasurement((DistanceTypes) type, name,
value);
}
throw new NotImplementedException();
}
}
public class VelocityUnitOfMeasurementFactory
{
public static UnitOfMeasurement CreateVelocityUnitOfMeasurement(VelocityTypes velocityType, string name, double value)
{
UnitOfMeasurement uom;
switch (velocityType)
{
case VelocityTypes.Knots:
uom = new Knots(name, value);
break;
case VelocityTypes.MetersPerSecond:
uom = new MetersPerSecond(name, value);
break;
default:
uom = new MetersPerSecond(name, value);
break;
}
return uom;
}
}
public class DistanceUnitOfMeasurementFactory
{
public static UnitOfMeasurement CreateDistanceUnitOfMeasurement(DistanceTypes distanceType, string name,
double value)
{
UnitOfMeasurement uom;
switch (distanceType)
{
case DistanceTypes.Meters:
uom = new Meters(name, value);
break;
case DistanceTypes.NauticalMiles:
uom = new NauticalMiles(name, value);
break;
case DistanceTypes.StatuteMiles:
uom = new StatuteMiles(name, value);
break;
default:
uom = new Meters(name, value);
break;
}
return uom;
}
}
public sealed class Knots : UnitOfMeasurement
{
public Knots(string name, double value)
{
MeasurementType = MeasurementTypes.Velocity;
RoundingDigits = 5;
ConvertToBaselineFactor = .514444;
ConvertFromBaselineFactor = 1.94384;
Name = name;
Value = value;
Units = "knots";
}
}
public sealed class Meters : UnitOfMeasurement
{
public Meters(string name, double value)
{
MeasurementType = MeasurementTypes.Distance;
RoundingDigits = 5;
ConvertToBaselineFactor = 1.0;
ConvertFromBaselineFactor = 1.0;
Name = name;
Value = value;
Units = "m";
}
}