2015-02-25 2 views
1

у меня есть блок кода, который является использование в значительной степени каждый контроллер, поэтому мне интересно, как, или что это лучшая практика для повторного использования кода в нескольких контроллеровПовторное использование кода в контроллерах

Простой пример был бы этот

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

Затем в другой контроллер я просто использовать

string something = CoolCode(); 

Где я должен поставить его, и как использовать его в каждом контроллере?

+2

Независимо от любого другого класса также применимо к контроллерам - используйте наследование, состав, создайте вспомогательный класс, класс расширения и т. Д. Невозможно дать конкретный ответ, если вы не укажете, что вы хотите сделать. Например, класс-помощник не может получить доступ к защищенным полям контроллера, в то время как базовый класс может. С другой стороны, базовый класс вводит очень тугое соединение –

+0

@PanagiotisKanavos, которое кажется хорошим ответом на меня, вы должны опубликовать его как таковой. – Rik

ответ

2

Что вы должны сделать, это расширить класс контроллера, что все ваши контроллеры наследуют сейчас и использовать эту абстракцию, чтобы обернуть все контроллеры, которые используют этот код:

public class MyControllerBase : Controller 
{ 
    public string CoolCode() { ... } 
} 

теперь вы просто унаследовать абстракции, а не по умолчанию один:

public class AnyController : MyControllerBase 
{ 
... 
} 

Однако в зависимости от того, что вам нужно, более подходящие подходы могут быть более подходящими.

+2

В этом случае я бы определенно поддержал композицию над наследованием. – Rik

+0

Хм, я согласен с вами, хотя, на мой взгляд, он должен сильно зависеть от типа логики этого метода. Если его код/​​функциональность, характерная для поведения контроллера, я оставил бы его в абстракции, но если это то, что просто используется в контроллерах, но не «сплоченно» (я просто создал новое слово) правильно, чем в композиции, было бы больше смысл. Не уверен, если я объясню, что я имею в виду ... И btw, потому что я обычно очень ленив и не хочу инициализировать новый класс в каждом контроллере, я бы поместил композицию в базовый класс :) – astian

0

MVC контроллер такого же, как обычный класс и контроллер имеют тот же .cs расширения

Таким образом, использование может использовать статический метод, как следующие.

HomeController objHomeController = new HomeController(); 
string something= objHomeController.CoolCode(); 
+0

Даже если это может работать, я полностью не согласен с этим ответом. Это вызывает сильную связь между двумя контроллерами. По моему мнению, весь «общий» код должен идти либо в классе utility/manager/whatevernameyoulike, либо в базовом классе, если общий код применяется к базовому предку двух кодов потребления –

+0

Я полностью согласен с вами Стив, мой ответ был просто для того, чтобы выполнить требование Пер Петтера. – DeepakJ

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

0
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); 
    } 
} 
Смежные вопросы