【发布时间】:2014-03-12 02:59:49
【问题描述】:
我有一些控制器(并且会更多),它们共享一些类似的操作:
public ActionResult DeleteConfirmed(int id)
{
Supplier s = db.Suppliers.Find(id);
s.Deleted = true;
db.SaveChanges();
return RedirectToAction("Index");
}
public ActionResult RestoreConfirmed(int id)
{
Supplier s = db.Suppliers.Find(id);
s.Deleted = false;
db.SaveChanges();
return RedirectToAction("Index");
}
这些操作是SuppliersController 的一部分。这样做的目的是,当我删除或恢复一个对象时,它会将数据库中的对象标记为已删除字段的真(恢复时为假)。
CurrenciesController、ProductsController 等许多其他控制器共享相同的行为...
在我展示的代码中,您应该看到明确指定了我的数据库实体 (Supplier) 以及存储库 (Suppliers)。
我想找到一种通用的方法。我想创建一个自定义控制器,并且所有其他具有相同行为的控制器都将对其进行扩展。在这种情况下,ProductsController 将扩展我的 DeleteRestoreController。
我怎样才能以“通用”的方式做到这一点?
db 是 DbContext
public partial class LE: DbContext
{
public LE()
: base("name=LE")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Category> Categories { get; set; }
public virtual DbSet<CategoryText> CategoryTexts { get; set; }
...
}
Categories 也有相同的行为。
【问题讨论】:
-
什么是
db?那是一个 Repository 对象,还是一个 DataContext?如果它是 DataContext,则您的代码已经尽可能优化。如果您在控制器后面使用 Repository 对象,只需将前三行代码重构为 Repository 方法,然后调用它。 -
@RobertHarvey 帖子已更新
-
我们讨论了多少这样的实例?除非你有 20 个或更多,否则我认为不值得麻烦,甚至可能不值得。
-
现在我还没有 20 个,但我预计会有很多。也是可以减少的冗余代码。
-
那么它不仅仅是一个供应商吗?如果你将它推回存储库方法,你只会得到一个包含所有实体的大
case语句,除非你有一个 generic repository。所以你所做的只是将复杂性推到其他地方(尽管你正在让你的模型更胖而你的控制器更瘦)。
标签: asp.net asp.net-mvc controller