给出以下代码:
public class Product
{
public Guid Id {get;set;}
}
public static class Products
{
public static Guid ProductWithSpecialProcessing = new Guid ("12345...");
}
...
public void ProcessOrder(IEnumerable<Product> products)
{
foreach(var product in product)
{
if(product.Id == Products.ProductWithSpecialProcessing)
DoSpecialProcessing();
DoSomeStuff(product);
}
}
是否有更好的方法来识别特殊产品,而无需在代码,app.config文件或标识“特殊产品”(具有多于1个“特殊处理”的标准化数据库结构)中对ID进行硬编码规则“并且它们对于不同的产品是不同的”,例如:
CREATE TABLE SpecialProcessing (ProductWithSpecialProcessing uniqueidentifier)
答案 0 :(得分:3)
public class Product
{
public Guid Id {get;set;}
public virtual void DoStuff() {}
}
public class ProductWithSpecialProcessing : Product
{
public override void DoStuff() {}
}
public void ProcessOrder(IEnumerable<Product> products)
{
foreach(var product in products)
{
product.DoStuff();
}
}
答案 1 :(得分:2)
我会去继承路线。
第一步是创建SpecialProduct
Product
的祖先,并通过某种方式将它们与您的数据库记录相关联。可能性包括数据库中的映射表,或者类可以定义自己的映射。
然后您的数据访问层将有一个工厂,它将返回由您在上面定义的映射创建的Products
集。
你的应用程序的其余部分可以使用这些Products
,而不是在他们“特殊”时是否真正关心。
像这样......
class Product {}
[MapTo("<GUID>"] //your attribute...
class SpecialA : Product { }
class ProductFactory
{
private Dictionary<Guid, Type> _productMap = ...;
public ProductFactory()
{
//Initialize map to types that are Products AND have a MapTo attribute
}
public Product[] GetBy(...criteria...)
{
// dynamically instantiate Products
// if the Guid exists in map, use that type
// otherwise, use Product
}
}
答案 2 :(得分:1)
您可以为不同的处理类型定义枚举
[Flags] // this allows you to define multiple special
// processing types for each product
public enum Processing
{
None = 0,
Special1,
Special2,
// ...
}
并将其作为int存储在数据库的Product表中。
然后,您可以根据该值进行进一步处理。