Стратегия доступа к идентификаторам GUID в коде - PullRequest
0 голосов
/ 07 января 2012

С учетом следующего кода:

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 «специальной обработки» правила "и они разные для разных продуктов), например:

CREATE TABLE SpecialProcessing (ProductWithSpecialProcessing uniqueidentifier)

Ответы [ 3 ]

3 голосов
/ 07 января 2012
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();
    }
}
2 голосов
/ 07 января 2012

Я бы пошел по пути наследования.

Первым шагом будет создание ваших 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
    }
}
1 голос
/ 07 января 2012

Вы можете определить перечисление для различных типов обработки

[Flags] // this allows you to define multiple special
        // processing types for each product
public enum Processing
{
    None = 0,
    Special1,
    Special2,
    // ...
}

и сохранить его как int в таблице Product в вашей базе данных.

Затем вы можете выполнить дальнейшую обработку в зависимости отна это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...