Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StructureMap不扫描当前文件夹中的程序集_C#_Structuremap_Asp.net Core Webapi_Structuremap4 - Fatal编程技术网

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

C# StructureMap不扫描当前文件夹中的程序集,c#,structuremap,asp.net-core-webapi,structuremap4,C#,Structuremap,Asp.net Core Webapi,Structuremap4,因此,我对ASP.Net核心Web API应用程序中的最新StructureMap(v4.6.1)有一个问题: 以下是我所拥有的: Web API项目 接口项目 程序集A(实现接口项目中接口的子集) 程序集B(实现接口项目中定义的其余接口) 程序集A使用标准约定来实现接口,即在名为某物的类中实现接口 程序集B还实现接口项目中定义的几个通用接口。在命名这些实现时没有使用特殊的约定 程序集A和程序集B都构建并部署在执行Web API项目的根文件夹中。Web API项目不引用任何基础程序集(接口、

因此,我对ASP.Net核心Web API应用程序中的最新StructureMap(v4.6.1)有一个问题:

以下是我所拥有的:

  • Web API项目
  • 接口项目
  • 程序集A(实现接口项目中接口的子集)
  • 程序集B(实现接口项目中定义的其余接口)
程序集A使用标准约定来实现接口,即在名为某物的类中实现接口

程序集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>();
}
公共IServiceProvider配置服务(IServiceCollection服务)
{
services.AddMvc();
var container=新容器();
container.Configure(c=>
{
c、 扫描(扫描仪=>
{
scanner.AssembliesFromApplicationBaseDirectory();
scanner.WithDefaultConventions();
});
c、 填充(服务);
});
返回container.GetInstance();
}
当我检查已注册的程序集时,即使程序集在运行时存在,扫描仪也不会拾取使用默认约定的具体类型

我希望达到以下目标:

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()添加到scanner中,但没有效果


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

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

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

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

可能是扫描程序找到了A和B,但无法加载它们引用的所有程序集。尝试挂接AssemblyResolve事件以查看它试图加载的内容。还要确保base dir中的程序集不在共享上/来自共享(或被标记为来自不安全区域),这可能会阻止加载它们。我已连接到该事件,它显示正在扫描我的所有程序集,但是当涉及到获取接口和实现并将它们添加到容器时,它什么也做不了。假设其中有一些泛型需要注册,但是注册存在,并且它没有接收它们,并且应用程序因结构映射而崩溃,抱怨IComponent无法将其映射到具体实现这是一个子依赖项,ASP.NET没有直接依赖项。考虑到这个约束条件,这仍然有效吗?你说的次依赖是什么意思?方法将返回项目中所有引用的程序集,然后您可以扫描它们。这两个程序集之间没有显式引用。它就像一个插件。是的,我现在明白了,是的,它会工作的。在我的例子中,我也遇到了同样的情况,正如您所写的,在A和BI中的程序集中,接口程序集和程序集中的实现之间存在显式的依赖关系,直到星期一才能进行测试