控制台应用程序的依赖项注入和项目结构
本文关键字:项目 结构 注入 应用程序 依赖 控制台 | 更新日期: 2023-09-27 18:28:36
我有4个项目:
核心(IServer):
- 系统
- System.Core
依赖解析程序:
- 核心
- 结构映射
基础设施(服务):
- 核心
- 外部依赖关系
控制台:
- 核心
- DependencyResolver
需求:
我尝试仅在DependencyResolver中使用StructureMap。此外,控制台应用程序不应该知道任何有关基础结构的信息。
当我不想在控制台应用程序上引用StructureMap时,我必须构建一个ServiceLocator。
在DependencyResolver中,我有一个引导程序,负责调用StructureMap注册表的东西(Register)
在控制台应用程序中,我想获得一个实例。为此,我需要参考StructureMap。另一种方法是围绕StructureMaps解析方法编写一个小包装器。
有没有其他更好的方法将控制台与StructureMap脱钩?
虽然我看到了将IoC寄存器、解析、释放与应用程序实现分离的原因,但我看不出IoC容器不应该在控制台应用程序(组合根)中,而应用程序实现不应该在另一个程序集中的任何原因。
这样控制台应用程序就非常简单:
- 创建容器
- 加载容器配置
- 解析应用程序
- 调用在应用程序上运行并传递控制台参数
- 当应用程序退出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容器甚至具有自动实现这些接口工厂的功能。