控制台应用程序的依赖项注入和项目结构

本文关键字:项目 结构 注入 应用程序 依赖 控制台 | 更新日期: 2023-09-27 18:28:36

我有4个项目:

核心(IServer):

  • 系统
  • System.Core

依赖解析程序:

  • 核心
  • 结构映射

基础设施(服务):

  • 核心
  • 外部依赖关系

控制台:

  • 核心
  • DependencyResolver

需求:

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

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

在DependencyResolver中,我有一个引导程序,负责调用StructureMap注册表的东西(Register)

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

有没有其他更好的方法将控制台与StructureMap脱钩?

控制台应用程序的依赖项注入和项目结构

虽然我看到了将IoC寄存器、解析、释放与应用程序实现分离的原因,但我看不出IoC容器不应该在控制台应用程序(组合根)中,而应用程序实现不应该在另一个程序集中的任何原因。

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

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

SM看起来像这样:

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

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

interface ISomeFactory { ISomeDependency CreateSomeDependency() }

并通过注入容器在控制台应用程序中实现该接口,并使用它来解析实例。我想SM的实现看起来是这样的:

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

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