我正在寻找关于MVC架构方面的一些指导,以便在何处放置以下逻辑。
我的问题是:我应该在哪里计算产品评级的逻辑?
我想显示一些产品的详细信息,以及星级评分。星级评分由平均用户评分和内部评级组成;每个加权50%。
星级= 0.5(InternalRating)+ 0.5(AverageUserRating)
我目前使用Product控制器填充ViewModel上的3个字段:
@for (int i = 1; i <= Model.FullStars; i++)
{
<i class="full-star"></i>
}
@if (Model.HalfStar == true)
{
<i class="half-star"></i>
}
@for (int i = 1; i <= Model.EmptyStars; i++)
{
<i class="empty-star"></i>
}
目前我在Produt控制器中循环UserRating结果以获得平均评级,并且分裂为满星和空星的逻辑就在那里。
我的方法存在的问题是这种逻辑必须在调用产品的各种控制器中重复。
就我的理解而言,一个好的方法是创建一个类:
public class ProductStars
{
public int FullStars { get; set; }
public bool HalfStar { get; set; }
public int EmptyStars { get; set; }
}
然后为此类创建一个DisplayTemplate。它是否正确?如果是这样的话 - 我会将逻辑移动到实用程序类中的单独方法中,该实用程序类接受产品ID,从数据库中获取评级并填充类吗?
填充类的逻辑是否应该移动到SQL中的表值函数中?
感谢。
答案 0 :(得分:1)
就个人而言,我会将评级逻辑移动到业务逻辑服务中,并通过依赖注入将其注入控制器,然后创建星级评级视图助手以封装用于创建星星的HTML。
通过这种方式,您已经封装了理论上可以通过网站或网络服务调用的评级业务逻辑,并且您还为评级视图封装了您的HTML生成。
This article在演示如何创建自定义视图帮助程序方面做得很好。
我肯定会建议尽可能让你的控制器保持苗条,正如rsen娜之前的一篇评论所强调的那样。控制器应该只用于处理请求以及在视图和模型之间进行交谈。