gpt4 book ai didi

c# - 在 n 层应用程序中注入(inject)

转载 作者:行者123 更新时间:2023-11-30 18:45:51 24 4
gpt4 key购买 nike

虽然 DIIoC 容器 的概念相当简单,但我似乎在努力实现。我有一个四层应用程序,其中 UI LayerService Layer 使用 IoC 并且似乎工作正常但是 Service LayerBusiness Layer 绝对是一件痛苦的事情。

我已经阅读了很多专门针对 NinjectClass Libraries 的文章,但我仍然无法正确实现。我希望你们好心的人能给我指明正确的方向......

典型的分层流程:UI层>服务层>业务层>数据层

因此,如果可以将我的UI 层 的实现显示到服务层:

    private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IApiAuthorizationService>().To<ApiAuthorizationService>();
}

public class DebateController : ApiController
{
private IApiAuthorizationService _iApiAuthorizationService;
public DebateController(IApiAuthorizationService iApiAuthorizationService)
{
_iApiAuthorizationService = iApiAuthorizationService;
}
}

如您所见,UI 层 是一个注入(inject)IApiAuthorizationServiceWebApi 项目,这里没有什么特别复杂的地方。

因此,一旦构建了 ApiAuthorizationService,它就会指向许多存储库,但现在我将只添加其中的一个片段。

我们现在处于引用业务层的服务层:

    public class ApiAuthorizationService : IApiAuthorizationService
{
private IApiAuthTokenRepository _iApiAuthTokenRepository;
public ApiAuthorizationService(IApiAuthTokenRepository iApiAuthTokenRepository)
{
_iApiAuthTokenRepository = iApiAuthTokenRepository;
}
}

此时我已经在 Service Layer 上安装了 Ninject 并且还创建了一个将创建绑定(bind)的类:

public class Bindings : NinjectModule
{
public override void Load()
{
Bind<IApiAuthTokenRepository>().To<ApiAuthTokenRepository>();
}
}

基本上我被困在这一点上,不知道该去哪里,我又读了很多帖子,但很多人使用 Console Applications 来演示和一个 Class Library没有入口点。我的想法是添加一个 Startup.cs 来初始化绑定(bind)。

谁能用一些演示代码为我指明正确的方向?

谢谢。

最佳答案

复合根

主要用于实例化 DI 容器和配置它的位置应该是应用程序入口点。这意味着您永远不会在库中实例化 DI 容器。也意味着,入口点需要知道所有依赖项并相应地配置它们。Mark Seeman 有一篇关于该原理的博文:Composition Root .

“足够好”的方法

现在,在大多数项目中,我都在某种程度上违反了这种方法——这有优点也有缺点。Ninject(和 Autofac...)以模块的概念为特色。模块是一组绑定(bind)/注册,因此它是一个(部分)容器配置规范。这些可以添加到库中并在合成根中获取。这个概念记录在案here .

例子:

  • WpfApplication.exe
    • 包含一堆NinjectModule
    • 用以下内容表示组合根:var kernel = new StandardKernel()kernel.Load(AppDomain.CurrentDomain.GetAssemblies());<
  • ServiceLayer.dll
    • 包含一堆NinjectModule
  • 业务层.dll
    • 包含一堆NinjectModule
  • 数据层.dll
    • 包含一堆NinjectModule

什么时候不应该这样做?

  • 当这些 *.dll 中的任何一个应该用于多个项目/软件时 - 很可能根据项目的不同,您需要不同的绑定(bind)(容器配置)。这通常不能重复使用(另见 here )。
  • 当您计划频繁更换容器时,这会增加工作量

在这些情况下,您应该严格遵守 Mark 的组合根概念。

关于c# - 在 n 层应用程序中注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36461066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com