所以我在 ASP.Net Core Web API 应用程序中遇到了最新的 StructureMap (v4.6.1) 的问题:
这是我所拥有的:
- Web API 项目
- 接口项目
- 程序集 A(实现接口项目中的接口子集)
- 程序集 B(实现接口项目中定义的其余接口)
程序集 A 使用标准约定来实现接口,即接口 ISomething 在名为 Something 的类中实现。
程序集 B 还实现了接口项目中定义的几个通用接口。在命名这些实现时没有使用特殊约定。
程序集 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 引用的接口,这些接口在其他程序集中的其他地方实现。扫描仪正在拾取这些,但这些依赖项的依赖项没有。