我有两个不同的项目,实际上是两个不同的网站,如WebA& amp;韦伯。两个网站的结构在他们使用的控制器和模型方面是相同的。但是,前端非常不同。它们每个都有自己的UI和自己的jquery插件,适用于它们。
为了减少代码重复,我建议这两个项目继承自另一个引用项目[controllerDLL]中的控制器。 ControllerDLL是一个项目,它具有调用业务层和返回json序列化模型对象的所有逻辑。 WebA& WebB将只有空的控制器类,它们只是继承自基础项目[controllerDLL]。这样我觉得控制器代码不重复。
除了我提出的方式之外,有人能告诉我更好的方法来实现控制器重用吗? asp.net mvc 4是否提供了更好的内置方式?我可以高效地使用AREAS吗? DotNetNuke是我应该看的吗?或者我的方法是最好的前进方式?我不是在寻找如何将控制器移动到另一个项目中。我只是想知道我对实现控制器重用的选择。
感谢。
答案 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());
}