【问题标题】:StructureMap Not Scanning Assemblies in Current FolderStructureMap 不扫描当前文件夹中的程序集
【发布时间】:2018-07-17 13:49:20
【问题描述】:

所以我对 ASP.Net Core Web API 应用程序中的最新 StructureMap (v4.6.1) 有疑问:

这是我所拥有的:

  • Web API 项目
  • 接口项目
  • 程序集 A(实现接口项目中的接口子集)
  • 程序集 B(实现接口项目中定义的其余接口)

程序集 A 使用标准约定来实现接口,即接口 ISomething 在名为 Something 的类中实现。

Assembly B 还实现了 Interface 项目中定义的几个通用接口。在命名这些实现时没有使用特殊约定。

程序集 A 和程序集 B 均在执行 Web API 项目的根文件夹中构建和部署。 Web API 项目不引用任何底层程序集(接口、程序集 A 和程序集 B)。

在 Web API 项目 Startup.cs 中,我有以下内容:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    var container = new Container();
    container.Configure(c =>
    {
        c.Scan(scanner =>
        {
            scanner.AssembliesFromApplicationBaseDirectory();
            scanner.WithDefaultConventions();
        });

        c.Populate(services);
    });
    return container.GetInstance<IServiceProvider>();
}

当我检查已注册的程序集时,即使程序集在运行时存在,扫描器也不会拾取使用默认约定的具体类型。

我想要达到的目标如下:

  • 让扫描程序扫描目录并使用标准约定绑定它知道如何绑定的类
  • 对于其余接口(尤其是不遵循任何特定约定的通用接口)使用在定义具体类型的程序集中定义的注册表
  • 本质上,我想将我的底层架构视为执行环境的插件,即能够动态添加实现接口的程序集,并让 DI 容器使用默认约定或我在其中定义的注册表类注册它们大会。

注意:我也尝试将scanner.LookForRegistries() 添加到扫描仪,但无济于事。

注意 #2:还有其他程序集包含 API 引用的接口,这些接口在其他程序集的其他地方实现。扫描器正在拾取这些,但这些依赖项的依赖项没有。

【问题讨论】:

  • 可能是扫描器找到了 A 和 B,但无法加载它们引用的所有程序集。尝试挂钩 AssemblyResolve 事件以查看它尝试加载的内容。还要确保基本目录中的程序集不是在/来自共享(或以其他方式标记为来自不安全区域),这可能会阻止它们的加载。
  • 我已经加入了这个事件,它显示了我所有的程序集都在被扫描,但是当涉及到获取接口和实现并将它们添加到容器中时,它什么也不做。当然,那里有一些需要注册表的泛型,但是注册表在那里并且它没有拾取它们,并且应用程序因结构映射而崩溃,抱怨 IComponent 无法将其映射到具体实现

标签: c# structuremap asp.net-core-webapi structuremap4


【解决方案1】:

我认为问题不在 Structuremap 中,而是因为这是 ASP.NET 应用程序,并非所有程序集都在运行时立即加载,我通过

解决了这个问题
 var referencedAssemblies =BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();

此方法将返回所有程序集,然后您可以使用它们与 IoC 容器一起扫描!

【讨论】:

  • 这是一个子依赖,ASP.NET 对其没有直接依赖。考虑到这种限制,这仍然有效吗?
  • 子依赖是什么意思?上面的方法将返回项目中所有引用的程序集,然后您可以扫描它们
  • 两个程序集之间没有明确的引用。它就像一个插件。
  • 是的,我现在明白了,是的,它会起作用。在我的情况下,我遇到了同样的情况,正如您所写,您在 A 和 B 的程序集中的接口程序集和实现之间有明确的依赖关系
  • 我要到星期一才能测试这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多