我应该为一家公司编写一个大型软件。该公司有许多不同的部门,但是每个部门都需要相同的基本功能以及某些特定的部门功能。因此,我想通过使用不同的项目库来拆分功能,并将它们添加到基础中以最小化基础中的代码。下图显示了这个基本想法。
为了最小化复杂性,我有一个示例图,该图在基本项目(基本功能)中具有Web视图/ home / drawing和/ home / workschedule。在/ departmentA / special或/ departmentB / special下,还有两个需要特殊功能的部门。我想通过代码执行以下操作:
我想使用.net核心mvc项目(称为基本项目)构建一个解决方案。应该有每个部门必需的功能。除了通用代码以外,没有其他代码可以作为它们的代码。如果部门需要某些特殊功能,我想在此解决方案中为每个部门创建一个新项目,在我们的部门A和B的示例中。每个项目都应为控制器提供视图,如果我们调用例如/部门A /特殊部门。
现在我有不同的问题: 1.我如何通过诸如DepartmentA项目之类的链接项目调用控制器并交付视图?我在asp.net核心中阅读了有关应用程序部分的内容,但是我只能访问无法提供视图的控制器功能。我这样做如下:
我遇到以下错误:
解决方案就像克里斯·普拉特(Chris Pratt)为先前的问题所描述。但是现在我具有与以前相同的项目结构,但是还需要一些特殊的JavaScript和CSS文件用于DepartmentA和DepartmentB。
这与CommonUI(嵌入式资源+特定资源文件提供程序)一起使用。因此,示例如下:
<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>
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);
}
}
现在,我必须通过以下调用将其包括在我的主MVC项目的启动中的ConfigureServices方法中:
services.AddCommonUI();
但是有一个大问题。因为我必须在Razor类库参考中添加一个使用。因此,当我将依赖关系从部署部门A切换到部门B时,我还必须更改基本项目中的用法。也许有人可以给我提示。
答案 0 :(得分:2)
似乎您只有一个标准的类库,您试图在其中添加视图并与之共享。那不可能这些视图将不会编译到类库中,因此无法从该类库中引用。
您可以 做的是创建一个Razor Class Library。尽管有名称,但它与ASP.NET Core应用程序相比,与类库有更多的共同点,只有Program
和Startup
也没有(即,它不能独立运行)。但是,这样,视图将嵌入到库中,因此可供引用它的项目使用。该文档专门针对Razor Pages,但是MVC样式的视图和控制器也可以正常工作。