Бизнес-логика, которая зависит от строковых значений - PullRequest
1 голос
/ 12 января 2012

В одном из моих проектов, над которыми я работаю, я использую Entity Framework 4.1 (Code First). У меня есть отношения между двумя объектами, как следующие:

public class Project
{
    public int Id { get; set; }

    // snip...

    // Foreign Key
    public string ProjectId { get; set; }

    // navigation proeprty
    public virtual ProjectType ProjectType { get; set; }
}

public class ProjectType
{
    public string Id { get; set; }

    public virtual ICollection<Project> Projects { get; set; }
}

Сейчас я занимаюсь бизнес-логикой, которая зависит от того, какой тип проекта создается / редактируется, поэтому у меня есть такой код:

if( "P".Equals(project.ProjectTypeId) )
    // logic goes here

Есть ли другой способ сделать это, чтобы я не сравнивал строковые значения?

Ответы [ 3 ]

3 голосов
/ 12 января 2012

Я бы лично предпочел преобразовать ProjectTypeId в тип enum.

var projectType = Enum.Parse(typeof(ProjectType), project.ProjectTypeId);
switch(projectType)
{
    case ProjectType.P: // logic goes here
    case ProjectType.N:
        break;
    default: throw new ArgumentOutOfRangeException("That wasn't a valid project type");
}

Я предполагаю, что у вас есть фиксированное число ProjectTypes, и что ваш код должен знать обо всех них,Этот подход дает вам единый «источник правды», на который нужно смотреть, когда вам нужно увидеть все типы ProjectType, которые можно использовать.Я предпочитаю это другим опциям, таким как класс со строковыми константами, потому что:

  1. Проще быстро "потерпеть неудачу", если вы обнаружите, что у проекта недопустимый тип проекта.передать ProjectType s как строго типизированные параметры служебным функциям и тому подобное.
2 голосов
/ 13 января 2012

Я знаю, что на этот вопрос уже дан ответ, но мы используем немного иной подход, чем перечисления:

public static class ProjectType
{
    public const string P = "P";
    public const string N = "N";
}

У вас все еще есть единственный источник правды. Как и перечисления, константы определяются во время компиляции. Итак, ваш клиентский код будет выглядеть так:

if( ProjectType.P.Equals(project.ProjectTypeId) )
    // logic goes here

По сути, он делает то же самое, но без необходимости Enum.Parse.

0 голосов
/ 14 января 2012

Я согласен с Остином, что у тебя действительно должно быть что-то вроде ..

проект публичного класса
{
public int Id {get; задавать; }

// snip...      

// Foreign Key      
public string ProjectId { get; set; }      

// navigation proeprty      
public virtual IProjectType ProjectType { get; set; }      

}

открытый класс ProjectTypeA: IProjectType
{ public string Id {get; задавать; }

public virtual ICollection<Project> Projects { get; set; } 

}

открытый класс ProjectTypeB: IProjectType
{ public string Id {get; задавать; }

public virtual ICollection<Project> Projects { get; set; } 

}

Тогда вы можете получить что-то вроде

if (p.ProjectType равен ProjectTypeB) {}

или по ссылке

var projects = из p в Project.ofType выберите p;

...