在 ASP.Net 核心中注入服务、业务逻辑 类 和记录器
Injection of Services, Business Logic classes and Logger in ASP.Net Core
我的应用程序包括表示层项目,它是 Web 服务器的项目。
在 PL 的 Startup class 中,我添加了一个 IServiceFacade 类型的单例服务。控制器将被注入并使用它来与较低的服务层项目功能对话(PL 项目持有对 ServiceLayer 项目的引用)。
ServiceFacade 持有 IBusinessLogicFacade 类型的对象,并使用它与较低的业务层项目(服务层项目持有对业务逻辑项目的引用)进行对话。
我还使用.net Core 内置的日志记录API 将ILogger 注入控制器、ServiceFacade 和BusinessLogicFacade,这只需要引用Microsoft.Extensions.Logging。
就像我将 ServiceFacade 添加为服务,从而启用注入一样,
我想将 BusinessLogicFacade 添加为服务,但这将需要从 PL 项目到业务逻辑项目的引用,从而打破层分离。
我可以在 ServiceFacade 中创建 BusinessLogicFacade "manually",但是我还需要提供一个 ILogger,因为我无法在手动创建 BusinessLogicFacade 时使用它的注入。
services.AddSingleton<IServiceFacade,ServiceFacade> (OK, PL holds a reference to ServiceLayer Project)
services.AddSingleton<IBusinessLogicFacade,BusinessLogicFacade> (Not OK, Requires a reference from PL to BL).
有没有办法在"manually"创建对象时通过注入接收一些参数(如ILogger)?
我该如何解决这个问题?
不幸的是,这种(依赖性引用)并不容易避免 - 特别是在使用默认 ASP.Net 核心容器时。您可以使用第 3 方 DI 容器解决此问题。您可以阅读 architecture ideas here. Specifically for your question, read the "Note" section in the "UI layer types" paragraph (after Figure 5.12 in the specified link).
我的应用程序包括表示层项目,它是 Web 服务器的项目。
在 PL 的 Startup class 中,我添加了一个 IServiceFacade 类型的单例服务。控制器将被注入并使用它来与较低的服务层项目功能对话(PL 项目持有对 ServiceLayer 项目的引用)。
ServiceFacade 持有 IBusinessLogicFacade 类型的对象,并使用它与较低的业务层项目(服务层项目持有对业务逻辑项目的引用)进行对话。
我还使用.net Core 内置的日志记录API 将ILogger 注入控制器、ServiceFacade 和BusinessLogicFacade,这只需要引用Microsoft.Extensions.Logging。
就像我将 ServiceFacade 添加为服务,从而启用注入一样, 我想将 BusinessLogicFacade 添加为服务,但这将需要从 PL 项目到业务逻辑项目的引用,从而打破层分离。
我可以在 ServiceFacade 中创建 BusinessLogicFacade "manually",但是我还需要提供一个 ILogger,因为我无法在手动创建 BusinessLogicFacade 时使用它的注入。
services.AddSingleton<IServiceFacade,ServiceFacade> (OK, PL holds a reference to ServiceLayer Project)
services.AddSingleton<IBusinessLogicFacade,BusinessLogicFacade> (Not OK, Requires a reference from PL to BL).
有没有办法在"manually"创建对象时通过注入接收一些参数(如ILogger)? 我该如何解决这个问题?
不幸的是,这种(依赖性引用)并不容易避免 - 特别是在使用默认 ASP.Net 核心容器时。您可以使用第 3 方 DI 容器解决此问题。您可以阅读 architecture ideas here. Specifically for your question, read the "Note" section in the "UI layer types" paragraph (after Figure 5.12 in the specified link).