C# 为什么我可以使用未直接添加到project.json(ASP.NET核心)中的库中的类

C# 为什么我可以使用未直接添加到project.json(ASP.NET核心)中的库中的类,c#,asp.net-core,C#,Asp.net Core,我的应用程序中有三个层:存储库->服务->Web。在VS 2015中,存储库和服务被创建为“类库(包)”(这个应用程序也应该在OSX/Linux上运行,这就是为什么我必须创建这种库的原因)。我将服务中的依赖项添加到存储库中。以下是服务中project.json的一部分: "dependencies": { "App.Repositories": "" }, using App.Repositories; namespace App.Services { publ

我的应用程序中有三个层:
存储库->服务->Web
。在VS 2015中,存储库和服务被创建为“类库(包)”(这个应用程序也应该在OSX/Linux上运行,这就是为什么我必须创建这种库的原因)。我将服务中的依赖项添加到存储库中。以下是服务中project.json的一部分:

   "dependencies": {
      "App.Repositories": ""
  },
using App.Repositories;

namespace App.Services
{
    public class Service
    {
        public Service()
        {
            var repository = new Repository();
            repository.DoSomething();
        }
    }
}
我在Web服务中添加了依赖项。以下是Web(MVC6)中project.json的一部分:

由于这一点,我可以在服务中编写这样的代码:

   "dependencies": {
      "App.Repositories": ""
  },
using App.Repositories;

namespace App.Services
{
    public class Service
    {
        public Service()
        {
            var repository = new Repository();
            repository.DoSomething();
        }
    }
}
这是可以的,因为项目之间存在“引用”。但是,我也可以使用放置在Web存储库中的类,如:

using Microsoft.AspNet.Mvc;
using App.Repositories;

namespace App.Web.Controllers
{
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        public ValuesController()
        {
            var repository = new Repository();
            repository.DoSomething();
        }
    }
}
问题:

  • 这在ASP.NET Core 1中是正常行为吗
  • 如何防止在Web中使用存储库中的类(或非直接添加的库之间的常规类)
    有趣的问题,从未意识到这是一个问题,但这可能是因为我习惯于在web应用程序中引用它(您需要引用依赖项注入设置的所有程序集)。问题是,在旧项目中没有传统的引用。ASP.NET核心具有依赖项,它使用nuget包,因此所有依赖项都会自动“引用”。原因之一是ASP.NET Core是模块化的,不再具有运行时,因此运行应用程序所需的所有程序集始终与应用程序一起发布,以便并行执行。只有当您知道该程序集在系统上可用时(或者在发布时将其作为应用程序的一部分提供),引用才能正常工作,但是,您需要确保在发布期间提供它。理论上,您可以使用
    “frameworks”:{“dnx50”:{“frameworkAssemblies”:{“App.Repositories”:“}}}}
    来创建一个不是程序集的引用,但这不会太好,因为dnx(提供运行时)已被弃用,并将被从nuget提要获取所有运行时包的dotnet cli所取代,因此没有“运行时”对我来说,这是一个问题,因为如何将大型企业应用程序划分为多个层?我希望防止将存储库(错误地使用事件)用于控制器(例如)。当你有几个团队和很多开发人员时,这一点很重要。@mczachurski对此的评论太少,但是。。。软件工程界正在慢慢地从这些N层大企业应用程序转向具有定义良好的有界上下文的微服务体系结构(想想DDD和消息传递体系结构)。ASP.NET核心就是这种演变的证明。如果您坚持使用这个大型多层企业应用程序,那么您最好使用ASP.NET 4.6。没问题!只是说说而已。