如何在不同型号的控制器之间共享代码?
在'超级'控制器操作中,我希望能够确定调用哪个控制器(路由),并使用该路由名称加载相应的模型,并使用该模型查询数据库以传递给视图
我可以在Ruby on Rails中轻松完成这项工作,MVC是否允许这样做?
答案 0 :(得分:1)
您可以使用泛型:
public abstract class GenericRepositoryController<TModel> : Controller
{
private readonly IRepository<TModel> _repository;
protected GenericRepositoryController(IRepository<TModel> repository)
{
_repository = repository;
}
public ActionResult Index()
{
var model = _repository.GetAll();
return View(model);
}
}
public class EmployeeController : GenericRepositoryController<Employee>
{
public EmployeeController(IRepository<Employee> repository) : base(repository)
{
}
}
public class CustomerController : GenericRepositoryController<Customer>
{
public CustomerController(IRepository<Customer> repository) : base(repository)
{
}
}
答案 1 :(得分:0)
当然,如果您愿意,可以将所有路线指向中央控制器,然后重定向。或者,您可以使用其他控制器继承的基本控制器也可以执行此操作。
答案 2 :(得分:0)
你不能为所有控制器使用基类,并添加logich确定基类中的路由吗?
或者将“规则查找方法”提取到辅助类并在每个方法中使用它。
答案 3 :(得分:0)
将您的模型视为数据结构,简单类。它们应该具有属性,但通常不是代码。代码应该在别处组织,以便可以共享。
如何取决于您要共享的代码的性质。如果它是控制器级逻辑,例如与模型或视图操作相关,则最好在控制器基类中。如果它是业务逻辑,它应该在服务中。将服务视为控制器与存储库或数据库之间的业务逻辑层(取决于您是否使用IOC)。您的服务应包含在您的站点引用的库项目中,以便任何控制器都可以引用它们。
您的路由规则应根据命名约定将您置于适当的控制器中,并调用操作方法。这些方法可以调用来自其他类或引用项目的任何代码。