使用以下代码,假设我在变量类型中有5种不同的类型。有没有一种方法可以编写一个并使用变量“type”来决定模型是什么,在这种情况下是“CommentVote?”而不是编写5个条件语句。或者这更像是我设计数据模型的方式的缺陷,这5个事物中的每一个都有“投票”模型?
if (type == "comment")
{
CommentVote voteObj = db.CommentVotes
.Where(x => x.UserID == UserID && x.CommentID == id)
.SingleOrDefault();
if (voteObj != null)
{
voteObj.Vote = vote;
db.SaveChanges();
}
else
{
CommentVote c = new CommentVote {
CommentID = id, UserID = UserID, Vote = vote, DateCreated = DateTime.Now
};
db.CommentVotes.Add(c);
db.SaveChanges();
}
count = (db.CommentVotes.Count(x => x.CommentID == id && x.Vote == true) - db.CommentVotes.Count(x => x.CommentID == id && x.Vote == false));
}
魔法代码:我希望能够做的事情。
var modelName = "";
var modelOtherName = "";
if (type == "comment") {
modelName = CommentVote;
modelOtherName = CommentVotes;
}
modelName voteObj = db.modelOtherName
.Where(x => x.UserID == UserID && x.CommentID == id)
.SingleOrDefault();
更新:我开始认为我的模型可能是废话,基于下面引用的一些阅读材料。所以我将其中一些作为参考。如果这是我应该尝试解决的问题,请告诉我。
public class CommentVote
{
public int CommentVoteID { get; set; }
public bool Vote { get; set; }
public DateTime DateCreated { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
public int CommentID { get; set; } //This row changes from model to model
public virtual Comment Comment { get; set; } //This row changes from model to model
}
我有一些几乎相同的模型。
答案 0 :(得分:2)
据我了解你的问题,它与数据库架构有关。
如果这些投票彼此之间没有太大差异(就属性而言),我不会为它们使用不同的表格。而是使用Type列创建一个Vote表,并且(如您提供的示例中)为CommentID创建可为空的列。
然后你可以使用类继承来反映你的投票(投票基类和CommentedVote子类)。
Table Per Hierarchy Inheritance in Entity Framework
<强>更新强> 最好不要在所有类别中重复相同的属性。你只需使用这样的吸气:
public abstract class Vote
{
public int VoteID { get; set; }
public bool isVote { get; set; }
public DateTime DateCreated { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
public int VoteType { get; set;} //this property specifies type of vote (e.g. VoteType=1 for CommentedVote )
}
public class CommentVote : Vote
{
public int CommentID { get; set; }
public virtual Comment Comment { get; set; }
}
public class OtherVote : Vote
{
public int OtherID { get; set; }
public virtual Other Other { get; set; }
}
在this非常好的博客文章中,您可以找到所有可能的方法。我正在撰写的那个名为Table per Hierarchy(TPH)。
答案 1 :(得分:1)
假设您执行相同的操作并设置相同的数据,您绝对可以将代码减少到单个语句。在这种情况下,您应该有一个包含公共操作和数据的接口,以及一个根据类型实例化正确对象的对象工厂。
答案 2 :(得分:0)
如果使用反射实现Factory模式,则可以执行此操作,一个非常基本的示例是shown here。
简而言之,您所做的是:由于您可以使用5种不同的类型,因此您可以创建5个不同的类,每个类都实现特定的接口。然后创建工厂类以使用反射来获取最适合您情况的类(无论是使用直接类名,如示例中,还是使用类上的属性,例如{{3 }})。工厂返回该接口的一个实例,然后您可以从界面调用公开的方法为您完成所有这些操作。
最好的部分是,如果你需要制作另一种类型,你所要做的就是添加另一个具有你将在工厂中搜索的属性/名称的类。您的其他代码都不需要受到影响,从而使您符合开放/封闭原则。