我有一个代码块,几乎在每个控制器中使用,所以我想知道在多个控制器中重用代码的最佳实践是什么,或者什么是最佳实践
简单的例子就是这个
public String CoolCode(){
// Stuff
return MyStuff;
}
然后在另一个控制器中我只使用
string something = CoolCode();
我应该把它放在哪里,以及如何在每个控制器中使用它?
答案 0 :(得分:2)
你应该做的是扩展所有控制器现在继承的Controller类,并使用这个抽象来包装所有使用该代码的控制器:
public class MyControllerBase : Controller
{
public string CoolCode() { ... }
}
现在你只是继承你的抽象而不是默认抽象:
public class AnyController : MyControllerBase
{
...
}
然而,根据您的需要,精确地采用不同的方法可能更合适。
答案 1 :(得分:1)
就个人而言,我会将助手类注入控制器:
public interface IHelper
{
string CoolCode();
}
public class Helper : IHelper
{
public string CoolCode()
{
return "Cool code";
}
}
public class SomeController
{
private IHelper _helper;
public SomeController(IHelper helper)
{
_helper = helper;
}
public ActionResult Index()
{
//call _helper.CoolCode();
}
}
然后你需要使用某种IoC容器注入它,我推荐Castle Windsor
这一切都很抽象,但我建议你仔细阅读:
http://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be
答案 2 :(得分:1)
public interface IBaseUserController
{
string SomePropety { get; set; }
ActionResult SignUp(string code, [Form] SomeViewModel model);
}
public class BaseUserController : Controller, IBaseUserController
{
private static string _somePropety = "";
public BaseUserController(){}
public string SomePropety
{
get
{
return _somePropety;
}
set { _somePropety = value; }
}
public virtual ActionResult SignUp(string code, [Form] SomeViewModel model)
{
// ... CoolCode maybe use SomePropety
return View(model);
}
}
public class TestUserController : BaseUserController
{
public TestUserController()
{
SomePropety = "Value";
}
public override ActionResult SignUp(string code, [Form] SomeViewModel model)
{
return base.SignUp(code, model);
}
public ActionResult SignUp2(string code, [Form] SomeViewModel model)
{
return base.SignUp(code, model);
}
}
答案 3 :(得分:0)
MVC控制器与普通类相同,控制器具有相同的扩展名.cs
因此,使用可以使用如下的静态方法。
HomeController objHomeController = new HomeController();
string something= objHomeController.CoolCode();