具有控制器和视图的不同项目

时间:2019-08-08 13:06:25

标签: .net-core asp.net-core-mvc asp.net-core-2.0

我应该为一家公司编写一个大型软件。该公司有许多不同的部门,但是每个部门都需要相同的基本功能以及某些特定的部门功能。因此,我想通过使用不同的项目库来拆分功能,并将它们添加到基础中以最小化基础中的代码。下图显示了这个基本想法。enter image description here

为了最小化复杂性,我有一个示例图,该图在基本项目(基本功能)中具有Web视图/ home / drawing和/ home / workschedule。在/ departmentA / special或/ departmentB / special下,还有两个需要特殊功能的部门。我想通过代码执行以下操作:

enter image description here

我想使用.net核心mvc项目(称为基本项目)构建一个解决方案。应该有每个部门必需的功能。除了通用代码以外,没有其他代码可以作为它们的代码。如果部门需要某些特殊功能,我想在此解决方案中为每个部门创建一个新项目,在我们的部门A和B的示例中。每个项目都应为控制器提供视图,如果我们调用例如/部门A /特殊部门。

现在我有不同的问题: 1.我如何通过诸如DepartmentA项目之类的链接项目调用控制器并交付视图?我在asp.net核心中阅读了有关应用程序部分的内容,但是我只能访问无法提供视图的控制器功能。我这样做如下:enter image description here

我遇到以下错误:

enter image description here

  1. 我怎样才能只将一些部门编入基础项目?

解决方案就像克里斯·普拉特(Chris Pratt)为先前的问题所描述。但是现在我具有与以前相同的项目结构,但是还需要一些特殊的JavaScript和CSS文件用于DepartmentA和DepartmentB。

这与CommonUI(嵌入式资源+特定资源文件提供程序)一起使用。因此,示例如下:

  1. 使用ItemGroup(Javascript / CSS文件所在的位置)和GenerateEmbeddedFilesManifest编辑.csproj文件

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.2" />
        <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" />
        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.0" />
        <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.0" />
        <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.1.0" />
      </ItemGroup>
      <ItemGroup>
        <EmbeddedResource Include="wwwroot\**\*" />
      </ItemGroup>
    </Project>

  1. 创建如下所示的CommonUI资源文件提供程序:

2.1首先为Startup-Call创建一个静态类,这对于加载初始嵌入式资源是必需的

    public static class CommonUIServiceCollectionExtensions
    {
        public static void AddCommonUI(this IServiceCollection services)
        {
            services.ConfigureOptions(typeof(CommonUIConfigureOptions));
        }
    }

2.2其次,创建一个读取嵌入式资源文件夹的类

internal class CommonUIConfigureOptions : IPostConfigureOptions<StaticFileOptions>
    {
        public CommonUIConfigureOptions(IHostingEnvironment environment)
        {
            Environment = environment;
        }
        public IHostingEnvironment Environment { get; }

        public void PostConfigure(string name, StaticFileOptions options)
        {
            name = name ?? throw new ArgumentNullException(nameof(name));
            options = options ?? throw new ArgumentNullException(nameof(options));

            // Basic initialization in case the options weren't initialized by any other component
            options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();
            if (options.FileProvider == null && Environment.WebRootFileProvider == null)
            {
                throw new InvalidOperationException("Missing FileProvider.");
            }

            options.FileProvider = options.FileProvider ?? Environment.WebRootFileProvider;

            // Add our provider
            var filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, "wwwroot");
            options.FileProvider = new CompositeFileProvider(options.FileProvider, filesProvider);
        }
    }
  1. 现在,我必须通过以下调用将其包括在我的主MVC项目的启动中的ConfigureServices方法中:

    services.AddCommonUI();

但是有一个大问题。因为我必须在Razor类库参考中添加一个使用。因此,当我将依赖关系从部署部门A切换到部门B时,我还必须更改基本项目中的用法。也许有人可以给我提示。

1 个答案:

答案 0 :(得分:2)

似乎您只有一个标准的类库,您试图在其中添加视图并与之共享。那不可能这些视图将不会编译到类库中,因此无法从该类库中引用。

您可以 做的是创建一个Razor Class Library。尽管有名称,但它与ASP.NET Core应用程序相比,与类库有更多的共同点,只有ProgramStartup也没有(即,它不能独立运行)。但是,这样,视图嵌入到库中,因此可供引用它的项目使用。该文档专门针对Razor Pages,但是MVC样式的视图和控制器也可以正常工作。