C# StructureMap不扫描当前文件夹中的程序集
因此,我对ASP.Net核心Web API应用程序中的最新StructureMap(v4.6.1)有一个问题: 以下是我所拥有的: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项目不引用任何基础程序集(接口、
- Web API项目
- 接口项目
- 程序集A(实现接口项目中接口的子集)
- 程序集B(实现接口项目中定义的其余接口)
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容器通过使用默认约定或我在程序集中定义的注册表类来注册它们
注意#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中的程序集中,接口程序集和程序集中的实现之间存在显式的依赖关系,直到星期一才能进行测试