2013-08-21 139 views
4

我有两个不同的项目,当部署时实际上是两个不同的网站,比如WebA & WebB。两个网站的结构在他们使用的控制器和模型方面是相同的。但是,前端是非常不同的。他们每个人都有自己的用户界面和自己的jquery插件,为他们工作。控制器在asp.net中的重用mvc

为了减少代码重复,我建议这两个项目都是从另一个引用项目[controllerDLL]中的控制器继承的。 ControllerDLL是一个具有调用业务层和返回json序列化模型对象的所有逻辑的项目。 WebB & WebB将分别拥有只从基础项目[controllerDLL]继承的空控制器类。这样我觉得控制器代码不会重复。

任何人都可以告诉我一个更好的方法来实现控制器重用,而不是我提出的方式吗? asp.net mvc 4是否提供了更好的内置方法?我可以在这里有效地使用AREAS吗? DotNetNuke是我应该看的东西吗?或者我的方法是最好的前进方向?我不在寻找如何将控制器移到另一个项目中。我只想知道我的选择是实现控制器重用。

谢谢。

+0

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

回答

2

看看这个SO question。您可以将所有视图保留在同一个项目中,并使用自定义视图引擎来查找视图(基于web.config设置)。

例如,您可以有2个文件夹/视图/ 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

由于这两个应用程序之间的差异是意见,你不需要把他们作为单独的项目。您可以拥有两组视图,并使用Web配置中的不同设置两次部署相同的项目。为此,您必须实现自己的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()); 
}