StructureMap 解决跨项目的依赖关系

StructureMap resolve a dependency across projects

我的解决方案中有 4 个项目

  1. UI
  2. 基础设施
  3. 实体
  4. 测试

所有代码优先数据库设置和结构图设置都在基础设施项目中。 UI 是 ASP.NET MVC5。基础设施项目还承载了一些 WebService 实现。

在 UI 项目中有一些 classes 作为控制器和外部 Web 服务之间的层。例如:

UI.Services.MappingService.cs 将使用 Infrastructure.ExternalWebServices.MappingWebService.cs

中的方法

到目前为止没有问题,接口名称都与具体的 class 名称匹配,因此 structuremap 正确解析了它们。但是,现在需要进行更改并从其中一个服务接口实施多个具体 classes。

基础结构项目无法引用 UI,因为它创建了循环依赖项。使用映射示例,我需要

UI.Services.Interfaces.IMappingService 要有不同的具体内容,结构图将通过注册表文件或工厂中的逻辑解析正确的内容 class。问题是注册表文件在基础设施项目中,它不知道 UI 所以 For(...).Use(...) 是不可能的。

如果我将接口移到实体项目中,它就可以看到它们,但这也涉及将具体的 classes 移出,这会破坏许多引用并需要大量移动要修复的文件。 UI 中的整个服务层加上相当多的视图模型需要移出到 Entities 项目才能实现。

有没有更简单的方法?我不是 DI/StructureMap 专家,所以我想确定我不只是让生活更艰难。

您可以使用 structuremap 的注册表功能

首先您需要在每个项目中创建注册表,如下所示。

public class InfrastructureRegistry : Registry
{
    public InfrastructureRegistry ()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();

        });

        //any spefic implementation   
    }
}              

然后你需要像下面这样创建你的容器。

return new Container(
            x => x.Scan
                   (
                       scan =>
                       {
                           scan.Assembly("YourProject.UI");
                           scan.Assembly("YourProject.Infrastructure");
                           scan.Assembly("Your.Entities");
                           scan.WithDefaultConventions();
                           scan.LookForRegistries();
                       }
                   )
          );

我在这里输入了 scan.lookforregistries,它将在每个项目中查找注册表。在这里我只输入了程序集的名称。您需要替换为您的程序集。

因此您可以为每个项目访问它,它会连接所有的东西。