依赖于字符串值的业务逻辑

时间:2012-01-11 22:21:21

标签: c# entity-framework-4.1 business-logic

在我正在开展的一个项目中,我使用的是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 个答案:

答案 0 :(得分:3)

我个人更喜欢将ProjectTypeId转换为枚举类型。

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. 如果您发现项目的项目类型无效,则“快速失败”会更容易。
  2. 您可以将ProjectType作为强类型参数传递给实用程序函数等。

答案 1 :(得分:2)

我知道这已经得到了解答,但我们使用的方法与枚举略有不同:

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

你仍然只有一个事实来源。与枚举类似,consts在编译时定义。所以你的客户端代码看起来像这样:

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

它基本上做同样的事情,但不需要Enum.Parse

答案 2 :(得分:0)

我同意奥斯汀的观点,你应该有类似的东西......

公共课项目
{
    public int Id {get;组; }

// snip...      

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

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

}

公共类ProjectTypeA:IProjectType
{     公共字符串Id {get;组; }

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

}

公共类ProjectTypeB:IProjectType
{     公共字符串Id {get;组; }

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

}

然后你可以拥有像

这样的东西

if(p.ProjectType是ProjectTypeB) {}

或链接

var projects = from Project.ofType中的p选择p;