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

Roo*_*ian 8 c# dependency-injection inversion-of-control console-application

我有4个项目:

核心(IServer):

  • 系统
  • System.Core程序

DependencyResolver:

  • 核心
  • StructureMap

基础设施(服务):

  • 核心
  • 外部依赖

安慰:

  • 核心
  • DependencyResolver

Requierements:

我试图只在DependencyResolver中使用StructureMap.此外,控制台应用程序不应该了解有关Infrastucture的任何信息.

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

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

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

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

Rem*_*oor 17

虽然我看到了分离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);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于启动时无法创建的内容,您可以在应用程序集中创建工厂界面:

interface ISomeFactory { ISomeDependency CreateSomeDependency() }
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 对,那是正确的.但问题出在哪里?这个程序集只有一个目的 - 自举! (6认同)