在asp.net mvc中重用控制器

时间:2013-08-21 14:08:53

标签: asp.net .net asp.net-mvc asp.net-mvc-4 razor

我有两个不同的项目,实际上是两个不同的网站,如WebA& amp;韦伯。两个网站的结构在他们使用的控制器和模型方面是相同的。但是,前端非常不同。它们每个都有自己的UI和自己的jquery插件,适用于它们。

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

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

感谢。

3 个答案:

答案 0 :(得分:2)

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

例如,您可以拥有2个文件夹/ Views / WebA和/ Views / WebB。自定义视图引擎可以查找web.config设置以找出要使用的文件夹并在那里搜索视图。这样您就不必复制控制器代码或将其移动到单独的项目中。它只会在运行时换出另一个表示层。

答案 1 :(得分:2)

您应该能够通过实现自定义控制器工厂来实现此目的,以根据配置设置实例化正确的控制器类。

您需要实现System.Web.Mvc.IControllerFactory接口。此接口中的两个方法是:

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

答案 2 :(得分: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());
}