2010-06-22 58 views
3

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

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

我可以很容易地在Ruby on Rails中做到这一点,MVC允许这样的事情吗?

回答

0

当然,你可以让所有的路由指向一个中央控制器,如果你愿意,然后重定向。或者,你可以有一个基地控制器,其他控制器也从此继承。

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) 
    { 
    } 
} 
0

觉得作为数据结构,简单的类。他们当然应该有属性,但通常不是代码。代码应该在其他地方组织,以便共享。

如何取决于你想分享的代码的性质。如果它是控制器级别的逻辑,例如与模型或视图操作相关,那么在控制器基类中它可能是最好的。如果它是业务逻辑,它应该在服务中。将服务视为控制器与存储库或数据库之间的业务逻辑层(取决于您是否使用IOC)。您的服务应该包含在您的网站引用的库项目中,以便任何控制器都可以引用它们。

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

相关问题