在代码中访问GUID ID的策略

时间:2012-01-06 22:50:38

标签: c# design-patterns

给出以下代码:

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)

3 个答案:

答案 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表中。

然后,您可以根据该值进行进一步处理。