我想重新组织MVC Core项目的结构,以便不使用水平图层(模型,控制器,视图),而是使用垂直“切片”:每个特征都包含在一个文件夹中,该文件夹包含与该特征相关的所有内容。 / p>
此结构的示例可能如下所示:
0.4
在较旧的项目中,我通过编写自定义控制器工厂来实现这一目标。
问题:
自定义控制器工厂是在ASP.NET MVC Core中实现此目的的最佳方式吗?
如果是这样,是否有一个如何在ASP.NET MVC Core中编写和注入自定义控制器工厂的示例?
答案 0 :(得分:2)
我认为您想要的是ViewExpander
,正如我们在ASP.NET JabbR频道中所讨论的那样。
您只需设置扩展器并使用它来告诉框架如何解释视图的搜索。
{0}
- 控制器行动
{1}
- 控制器名称
{2}
- 区域(如果适用)
using System;
using System.Collections.Generic;
using System.Linq;
namespace Microsoft.AspNet.Mvc.Razor {
public class ViewExpander : IViewLocationExpander {
public void PopulateValues(ViewLocationExpanderContext context) {
}
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) {
return viewLocations.ToList().Then(n => {
n.Add("/Layout/{1}/{0}.cshtml");
n.Add("/Layout/{0}.cshtml");
n.Add("/web/Views/{1}/{0}.cshtml");
n.Add("/web/Views/Shared/{0}.cshtml");
});
}
}
}
然后在Startup.cs
中,在ConfigureServices
方法中,将其连线;
services.Configure<RazorViewEngineOptions>(o => {
o.ViewLocationExpanders.Add(new ViewExpander());
});
在最新的RC2
边缘版本/夜间版本中,其中一些名称可能已更改,但功能仍然存在。
控制器可以进入任何文件夹,并具有您想要的任何命名空间设置 - 因此无需在那里更改任何内容。