gpt4 book ai didi

c# - 控制台应用程序的依赖注入(inject)和项目结构

转载 作者:太空狗 更新时间:2023-10-29 18:13:38 25 4
gpt4 key购买 nike

我有 4 个项目:

核心(IServer):

  • 系统
  • 系统核心

依赖解析器:

  • 核心
  • 结构图

基础设施(服务):

  • 核心
  • 外部依赖

控制台:

  • 核心
  • 依赖解析器

要求:

我试图仅在 DependencyResolver 中使用 StructureMap。此外,控制台应用程序不应该知道任何关于基础架构的信息。

当我不想在我的控制台应用程序上引用 StructureMap 时,我必须构建一个 ServiceLocator。

在 DependencyResolver 中,我有一个 Bootstrapper,负责调用 StructureMap 注册表(Register)

在我的控制台应用程序中,我想获取一个实例。为此,我需要引用 StructureMap。另一种方法是围绕 StructureMaps 解析方法编写一个小包装器。

还有其他更好的方法可以将控制台与 StructureMap 解耦吗?

最佳答案

虽然我看到了将 IoC register、resolve、release 与应用程序的实现分开的原因,但我没有看到 IoC 容器不应该在控制台应用程序(组合根)和应用程序中的任何原因而是在另一个程序集中实现。

这样控制台应用程序就非常简单了:

  1. 创建容器
  2. 加载容器配置
  3. 解决申请
  4. 在应用程序上调用运行并传递控制台参数
  5. 当应用程序退出运行方法时释放容器

SM 看起来像这样:

public void Main(params string[] args)
{
using (var container = new Container())
{
container.LoadAllConfigurationModules();
container.AddRegistry<SomeRegistry>();
container.GetInstance<Application>().Run(args);
}
}

对于无法在启动时创建的内容,您可以在应用程序集中创建一个工厂接口(interface):

interface ISomeFactory { ISomeDependency CreateSomeDependency() }

并通过注入(inject)容器在控制台应用程序中实现此接口(interface),并使用它来解析实例。我猜 SM 实现看起来像这样:

public class SomeFactory : ISomeFactory
{
public SomeFactory(IContainer sontainer) { this.container = container; }
ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); }
}

其他 IoC 容器甚至具有自动实现这些接口(interface)工厂的功能。

关于c# - 控制台应用程序的依赖注入(inject)和项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806737/

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