2013-08-21 3 views
4

У меня есть два разных проекта, которые на самом деле являются двумя разными сайтами при развертывании, например WebA & WebB. Структура обоих веб-сайтов одинакова с точки зрения контроллеров и моделей, которые они используют. Однако передняя часть очень отличается. У каждого из них свой собственный интерфейс и собственные плагины jquery, которые работают на них.Повторное использование контроллера в asp.net mvc

Чтобы уменьшить дублирование кода, я предлагаю обе эти проекты наследовать от контроллеров в другом ссылочном проекте [controllerDLL]. ControllerDLL - это проект, который будет иметь всю логику для вызова бизнес-уровня и возврата сериализованных объектов модели json. WebA & У каждого пользователя будут только пустые классы контроллера, которые просто наследуются от базового проекта [controllerDLL]. Таким образом, я чувствую, что код контроллера не дублируется.

Может ли кто-нибудь сказать мне лучший способ добиться повторного использования контроллера, кроме того, как я предложил? Имеет ли asp.net mvc 4 какой-либо встроенный способ сделать это лучше? Могу ли я использовать AREAS здесь продуктивно? Является ли DotNetNuke чем-то, на что я должен смотреть? Или мой подход лучший путь вперед? Я не ищу, как переместить контроллеры в другой проект. Я просто хочу знать, какие у меня варианты для повторного использования контроллера.

Спасибо.

+0

http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate- assemblylies.aspx – Satpal

ответ

2

Посмотрите на это SO question. Вы можете сохранить все представления в одном проекте и использовать настраиваемый механизм просмотра для поиска представлений (основываясь на настройке web.config).

Например, у вас может быть 2 папки/Views/WebA и/Views/WebB. Пользовательский механизм просмотра может найти настройку web.config, чтобы узнать, какую папку использовать и искать там виды. Таким образом вам не придется дублировать код контроллера или переместить его в отдельный проект. Он просто заменит один уровень презентации для другого во время выполнения.

+1

Я не уверен в этом подходе, так как они сказали, что их два проекта фактически развернуты как два отдельных сайта. Если представления из двух проектов объединены в один, я не думаю, что их можно будет развернуть отдельно. – asymptoticFault

+0

@asymptoticFault Я не понимаю, почему вы не могли развернуть их отдельно.Если вы измените настройку web.config на использование правильных представлений, что должно помешать вам развернуть это на 10 разных серверах/сайтах? – Becuzz

+0

Я имел в виду возможность развертывания двух наборов представлений как разных сайтов, потому что это то, что они хотели. – asymptoticFault

2

Вы должны быть в состоянии достичь этого, внедряя фабрику пользовательских контроллеров, чтобы создать экземпляр правого класса контроллера на основе настроек конфигурации.

Вы должны реализовать интерфейс System.Web.Mvc.IControllerFactory.The два метода в этом интерфейсе:

1.System.Web.Mvc.IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) - Для создания экземпляра контроллера, основанного на RequestContext и имя контроллера.

2.void ReleaseController(System.Web.Mvc.IController controller) - Отпустить экземпляр контроллера

Detailed information about using that interface is available

+0

вы также можете посмотреть следующую ссылку: http://stackoverflow.com/questions/401376/asp-net-mvc-put-controllers-into-a-separate-project – DarthVader

0

Поскольку разница между этими двумя приложениями являются взгляды, вам не нужно иметь их как отдельные проекты. вы можете иметь два набора представлений и развернуть один и тот же проект дважды, используя различные настройки в веб-конфигурации. Для этого вам нужно будет реализовать собственный ViewEngine, чтобы контроллер мог возвращать правильные правильные представления.

public class AppSettingViewEngine: RazorViewEngine 
{ 
    public AppSettingViewEngine() 
    { 
     string[] viewLocations = new string[] { }; 
     if (ConfigurationManager.AppSettings["Site"] == "WebA") 
     { 
      viewLocations = new[] { 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
      }; 
     } 
     if (ConfigurationManager.AppSettings["Site"] == "WebB") 
     { 
      viewLocations = new[] { 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
      }; 
     } 
     else 
     { 
      //Default Settings 
      viewLocations = new[] { 
       "~/Views/{1}/{0}.cshtml", 
       "~/Views/{1}/{0}.cshtml", 
       "~/Views/Shared/{0}.cshtml", 
       "~/Views/Shared/{0}.cshtml", 
      }; 
     } 

     this.PartialViewLocationFormats = viewLocations; 
     this.ViewLocationFormats = viewLocations; 
    } 
} 

Тогда вы регистрируете его в Application_Start следующим

protected void Application_Start() 
{ 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new AppSettingViewEngine()); 
} 
Смежные вопросы