4

所以我在 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 引用的接口,这些接口在其他程序集中的其他地方实现。扫描仪正在拾取这些,但这些依赖项的依赖项没有。

4

1 回答 1

0

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

 var referencedAssemblies =BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();

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

于 2018-02-14T19:45:24.440 回答