如何将asp.net核心mvc项目分离为多个程序集(.dll)?
我有3个项目
人力资源项目
ACC项目
我想编译成dll
我想将引用这些dll(HR.dll,HR.Views.dll,ACC.dll,ACC.Views.dll)添加到MyApp Project中。
然后运行MyApp项目也可以访问Employee&Chart Account模块。
答案 0 :(得分:0)
您想要的是不可能的,或者也许更好地说:这当然不是一个好主意。
通常,您需要使用Razor类库。然后,所有通用功能都将进入这些RCL。您的整个HR和ACC项目都可以是RCL,除非您也需要将它们作为完整的Web应用程序独立运行。在这种情况下,您将需要一个类似以下的结构:
在任何一种情况下,您都需要将所有需要共享的控制器,视图和静态资源都放在RCL中,因此,如果您确实有实际的HR / ACC Web应用程序,那么这些应用程序将很轻巧:大部分仅由Program
和Startup
的属性,以及它们各自RCL的依赖性。
有关更多信息,请参见documentation on Razor Class Libraries。
答案 1 :(得分:0)
如果要执行此操作,则需要执行以下两个步骤:
在stackoverflow上已经有解决方案:How to use a controller in another assembly in ASP.NET Core MVC 2.0?
它表示以下内容:
在
ConfigureServices
类的Startup
方法内部 调用以下内容:services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
在stackoverflow上也已经有解决方案:
How CompiledRazorAssemblyPart should be used to load Razor Views?
Loading Razor Class Libraries as plugins
这是上面链接中的一种可能的解决方案:
您需要做的是:
services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .ConfigureApplicationPartManager(ConfigureApplicationParts);
并配置类似的部分
private void ConfigureApplicationParts(ApplicationPartManager apm) { var rootPath = HostingEnvironment.ContentRootPath; var pluginsPath = Path.Combine(rootPath, "Plugins"); var assemblyFiles = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories); foreach (var assemblyFile in assemblyFiles) { try { var assembly = Assembly.LoadFile(assemblyFile); if (assemblyFile.EndsWith(".Views.dll")) apm.ApplicationParts.Add(new CompiledRazorAssemblyPart(assembly)); else apm.ApplicationParts.Add(new AssemblyPart(assembly)); } catch (Exception e) { } } }
如果您在我们单独的MVC项目中也有javascript和css文件,则需要将其嵌入到dll中,否则您的主应用程序将看不到它。因此,在您的HR和ACC项目中,您需要将其添加到您的.csproj文件中:
<ItemGroup>
<EmbeddedResource Include="wwwroot\**" />
</ItemGroup>
为了明确起见,我同意其他意见,我认为这不是一个好的架构,但是如果您愿意,也可以这样做。