如何在不同型号的控制器之间共享代码?

时间:2010-06-22 21:58:37

标签: c# .net asp.net-mvc model

如何在不同型号的控制器之间共享代码?

在'超级'控制器操作中,我希望能够确定调用哪个控制器(路由),并使用该路由名称加载相应的模型,并使用该模型查询数据库以传递给视图

我可以在Ruby on Rails中轻松完成这项工作,MVC是否允许这样做?

4 个答案:

答案 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)。您的服务应包含在您的站点引用的库项目中,以便任何控制器都可以引用它们。

您的路由规则应根据命名约定将您置于适当的控制器中,并调用操作方法。这些方法可以调用来自其他类或引用项目的任何代码。