重用控制器中的代码

时间:2015-02-25 13:44:31

标签: asp.net-mvc

我有一个代码块,几乎在每个控制器中使用,所以我想知道在多个控制器中重用代码的最佳实践是什么,或者什么是最佳实践

简单的例子就是这个

public String CoolCode(){
    // Stuff
    return MyStuff;
}

然后在另一个控制器中我只使用

string something = CoolCode();

我应该把它放在哪里,以及如何在每个控制器中使用它?

4 个答案:

答案 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();