c# - StructureMap 解决跨项目的依赖关系

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

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

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

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

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

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

中的方法

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

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

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

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

有没有更简单的方法?我不是 DI/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,它将在每个项目中查找注册表。在这里我只输入了程序集的名称。您需要替换为您的程序集。

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

关于c# - StructureMap 解决跨项目的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29470251/

相关文章:

c# - 使用 DropDownList 设置整个网站背景的问题

c# - ASP.NET 捆绑/缩小和嵌入式资源

c# - Autofac DI 并行.foreach

asp.net-mvc - 我应该如何在 Mvc 5 中路由 POST 和 GET

c# - EF-core OnModelCreating 方法中的依赖注入(inject)

c# - 如何使用 Simple Injector 将依赖项注入(inject)基类?

c# - 在c#中创建一个实现多个接口(interface)的抽象类

c# - Math.Ceiling 奇怪的行为

c# - 防止 wtrealm 中的跨站点脚本编写

asp.net-mvc - edmx 重建会创建一个重复的设计器 cs 文件