StructureMap解决跨项目的依赖关系

时间:2015-04-06 11:21:08

标签: c# asp.net-mvc dependency-injection structuremap

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

  1. UI
  2. 基础设施
  3. 实体
  4. 测试
  5. 所有代码优先数据库设置和结构图设置都位于基础结构项目中。 UI是ASP.NET MVC5。基础结构项目还承载一些WebService实现。

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

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

    中的方法

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

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

    UI.Services.Interfaces.IMappingService具有不同的混凝土,structuremap将通过注册表文件中的逻辑或工厂类来解析正确的混凝土。问题是注册表文件位于基础结构项目中,该项目不知道UI,因此无法For(...).Use(...)

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

    有更简单的方法吗?我不是DI / StructureMap专家,所以我想确保我不仅仅是让生活变得更加艰难。

1 个答案:

答案 0 :(得分:10)

您可以使用结构图的注册表功能

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

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,它将在每个项目中寻找注册表。在这里,我只推出了装配名称。您需要更换组件。

因此,您可以访问每个项目的内容,它将汇总所有内容。