ASP.NET MVC核心:自定义控制器工厂

时间:2016-04-02 11:56:59

标签: asp.net-mvc

我想重新组织MVC Core项目的结构,以便不使用水平图层(模型,控制器,视图),而是使用垂直“切片”:每个特征都包含在一个文件夹中,该文件夹包含与该特征相关的所有内容。 / p>

此结构的示例可能如下所示:

0.4

在较旧的项目中,我通过编写自定义控制器工厂来实现这一目标。

问题:

  1. 自定义控制器工厂是在ASP.NET MVC Core中实现此目的的最佳方式吗?

  2. 如果是这样,是否有一个如何在ASP.NET MVC Core中编写和注入自定义控制器工厂的示例?

1 个答案:

答案 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边缘版本/夜间版本中,其中一些名称可能已更改,但功能仍然存在。

控制器可以进入任何文件夹,并具有您想要的任何命名空间设置 - 因此无需在那里更改任何内容。