我是自动化仓库,我正在尝试为下一个任务创建域模型:如何分离具有接口的抽象级别?
仓库有很多产品。产品可以是液体或杂货,也可以是一件一件。仓库中有两条包装线可以包装液体产品或所有其他产品。逐件产品不需要包装。
这里是我的模型:
enum ProductType
{
Liquid,
Grossery
}
interface IProduct
{
ProductType ProductType { get; }
}
interface IPackedProduct : IProduct
{
bool IsPacked { get; }
}
interface ILiquidProduct : IProduct
{
}
interface IGrosseryProduct : IProduct
{
}
interface IPackingLine
{
IPackedProduct Pack(IProduct product);
}
interface IGrosseryPackingLine : IPackingLine
{
IPackedProduct Pack(IGrosseryProduct p);
}
class ProductPackingLine : IPackingLine
{
public IPackedProduct Pack(IProduct product)
{
Console.WriteLine("Packing {0} default packing line", product);
return new PackedProduct(product);
}
}
class LiquidsPackingLine : IPackingLine
{
public IPackedProduct Pack(ILiquidProduct product) // I want this <=======================
{
Console.WriteLine("Packing {0} by liquid packing line", product);
return new PackedProduct(product);
}
}
class GrosseryPackingLine : IPackingLine
{
public IPackedProduct Pack(IProduct product)
{
Console.WriteLine("Packing {0} by grossery packing line", product);
return new PackedProduct(product);
}
}
我使用的是这样的:
IProduct milk = new LiquidProduct(ProductType.Liquid);
IProduct pasta = new GrosseryProduct(ProductType.Grossery);
var packer = new PackingManager();
IPackedProduct packedMilk = packer.Pack(milk);
IPackedProduct packedPasta = packer.Pack(pasta);
这里是PackingManager
class PackingManager
{
public IPackedProduct Pack(IProduct product)
{
IPackingLine pl = GetPackingLineByProduct(product);
return pl.Pack(product);
}
private IPackingLine GetPackingLineByProduct(IProduct product)
{
switch (product.ProductType)
{
case ProductType.Liquid:
return new LiquidsPackingLine();
case ProductType.Grossery:
return new GrosseryPackingLine();
default:
throw new InvalidOperationException();
}
}
}
的问题是,如果我会使用IPackingLine.Pack(IProduct p)
我可以错误地将ILiquidProduct
的对象传递给错误的包装行。但我需要我所有的包装线实施IPackingLine
才能够以更常见的方式使用它们。
如何避免这种情况?
看来您需要使用泛型,因此您可以限定给定打包程序可打包的各种东西。猜测语言,参见例如https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/introduction-to-generics – jonrsharpe
您的'PackingManager'打破了打开关闭原则。为什么你需要一个通用的/通用的'PackingManager'? –
我需要某个人来决定使用哪一个包装线。在其他情况下,逻辑将分散在整个应用程序中。关于'GetPackingLineByProduct' - 这只是为了简单起见。在真正的应用程序中,我会注入一个工厂,它将建立我'IPackingLine' –