c# – 处理CRUD操作的MVC BaseController

我想重构我的基本CRUD操作,因为它们非常重复,但我不确定最好的方法.我的所有控制器都继承BaseController,如下所示:

public class BaseController<T> : Controller where T : EntityObject
{
    protected Repository<T> Repository;

    public BaseController()
    {
        Repository = new Repository<T>(new Models.DatabaseContextContainer());
    }

    public virtual ActionResult Index()
    {
        return View(Repository.Get());
    }
}

我像这样创建新的控制器:

public class ForumController : BaseController<Forum> { }

很好,很容易,因为你可以看到我的BaseController包含一个Index()方法,这意味着我的控制器都有一个Index方法,并将从存储库加载他们各自的视图和数据 – 这是完美的.我在编辑/添加/删除方法上苦苦挣扎,我的存储库中的Add方法如下所示:

public T Add(T Entity)
{
    Table.AddObject(Entity);
    SaveChanges();

    return Entity;
}

再次,好又容易但在我的BaseController中我显然做不到:

public ActionResult Create(Category Category)
{
    Repository.Add(Category);
    return RedirectToAction("View", "Category", new { id = Category.Id });
}

我通常会如此:任何想法?我的大脑似乎无法通过这个…; – /

最佳答案 您可以添加所有实体共享的接口:

public interface IEntity
{
    long ID { get; set; }
}

并使您的基本控制器要求:

public class BaseController<T> : Controller where T : class, IEntity

这将允许您:

public ActionResult Create(T entity)
{
    Repository.Add(entity);
    return RedirectToAction("View", typeof(T).Name, new { ID = entity.ID });
}

您还应该考虑使用依赖注入来实例化控制器,以便注入而不是手动实例化您的存储库,但这是一个单独的主题.

点赞