4

我有两个不同的项目,部署时实际上是两个不同的网站,比如 WebA 和 WebB。就它们使用的控制器和模型而言,这两个网站的结构是相同的。但是,前端却大不相同。他们每个人都有自己的 UI 和自己的适用于他们的 jquery 插件。

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

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

谢谢。

4

3 回答 3

2

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

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

于 2013-08-21T14:22:01.717 回答
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)- 释放控制器实例

提供有关使用该接口的详细信息

于 2013-08-21T14:26:02.897 回答
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());
}
于 2013-12-13T11:28:27.633 回答