StructureMap不扫描当前文件夹中的程序集

时间:2018-02-07 10:05:47

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

所以我在ASP.Net Core Web API应用程序中遇到了最新的StructureMap(v4.6.1)的问题:

这就是我所拥有的:

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

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

程序集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引用的接口,这些接口在另一个程序集中的其他位置实现。这些是由扫描程序拾取的,但这些依赖项的依赖关系不是。

1 个答案:

答案 0 :(得分:0)

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

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

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