Mou*_*Lin 12 model-view-controller asp.net-mvc controller business-logic
我对MVC模式不太熟悉.你能告诉我以下哪三种控制器动作更好吗?谢谢 :)
(1)查询在行动:
public ActionResult List()
{
var query = repository.Query().Where(it => it.IsHandled).OrderBy(it => it.Id);
// ...
}
Run Code Online (Sandbox Code Playgroud)
(2)有服务查询:
public ActionResult List()
{
var items = service.GetHandledItemsOrderById();
// ...
}
Run Code Online (Sandbox Code Playgroud)
(3)通过行动订购:
public ActionResult List()
{
var items = service.GetHandledItems().OrderBy(it => it.Id);
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果我们选择(1),那么我们在控制器中有太多的业务逻辑?
如果我们选择(2),可能会有很多服务方法GetXXXByYYY().
如果我们选择(3),为什么我们封装Where(it => it.IsHandled)但不是
OrderBy(it => it.Id.
有任何想法吗?
我确信意见可能会有所不同,但我已经学会了尝试在服务中保留尽可能多的业务逻辑。3将是我的选择。有了 1,您就已经发现了问题。使用 2,您将在服务中引入显示优先级。使用 3,您可以在必要时处理显示首选项。如果您要向业务层引入另一个接口,则选择 2 可能会导致不必要的代码迭代。
这取决于。:)
我的想法:
我喜欢保持服务松散,以尽量减少重复代码。我也是管道和过滤器的粉丝。
这就是我要做的(并且确实要做的)。
服务
public ICollection<Item> GetHandledItems<TKey>(OrderingOptions<Item, TKey> orderingOptions)
{
return repository
.Query()
.WhereHandled()
.WithOrdering(orderingOptions)
.ToList();
}
Run Code Online (Sandbox Code Playgroud)
项目过滤器.cs
public static IQueryable<Item> WhereHandled(this IQueryable<Item> source)
{
return source.Where(it => it.IsHandled);
}
public static IOrderedQueryable<T> WithOrdering<T, TKey>(
this IQueryable<T> source,
OrderingOptions<T, TKey> orderingOptions)
{
return orderingOptions.SortDescending
? source.OrderByDescending(orderingOptions.OrderingKey) :
source.OrderBy(orderingOptions.OrderingKey);
}
Run Code Online (Sandbox Code Playgroud)
订购选项.cs
public class OrderingOptions<T,TKey>
{
public OrderingOptions(Expression<Func<T,TKey>> orderingKey, bool sortDescending = false)
{
OrderingKey = orderingKey;
SortDescending = sortDescending;
}
public Expression<Func<T,TKey>> OrderingKey { get; private set; }
public bool SortDescending { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以在控制器中指定顺序:
var items = service.GetHandledItems(new OrderingOptions(it => it.Id));
Run Code Online (Sandbox Code Playgroud)
上述与选项3的区别:
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |