我正在阅读 .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";
}
}