【发布时间】: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