问题标签 [structuremap4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - StructureMap:注册泛型类型作为泛型接口的实现
给定一个接口
和一个实现它的类
我尝试通过For().Use()
和注册实现ConnectImplementationsToTypesClosing()
但无济于事;每次调用都会container.GetInstance<ISomething<Foo, Bar>>()
失败StructureMapConfigurationException
:
没有注册默认实例,并且无法自动确定类型 'ISomething<Foo, Bar>'
没有为 ISomething<Foo, Bar> 指定配置
1.) Container.GetInstance(ISomething<Foo, Bar>)
调用container.WhatDoIHave()
同一个容器会产生
尽管。此外,调用container.GetInstance<Something<Foo, Bar>>()
(引用实现而不是接口)也可以正常工作。
我错过了什么?
asp.net-mvc - 在 Lambda 函数中使用嵌套容器作为 IContext
我有一个使用 Structuremap 设置的 ASP.Net MVC 应用程序,并StructuremapDependencyScope
为每个请求提供一个嵌套容器。
只要自定义生命周期有效,我希望能够建立一个列表并让 StructureMap 返回该列表。
我在 Structuremap 中有以下内容Registry
:
这很好用,列表List<Cat>
只构建一次,直到生命周期到期。
但是,实例CatlistBuilder
(以及它需要的所有其他依赖项)不会在请求结束时处理。我怀疑原因是自定义生命周期 - 由于配置使用自定义生命周期,IContext
传入 lambda 函数似乎是根容器。如果我删除自定义生命周期,则使用当前的嵌套容器。
是否可以让嵌套容器提供CatlistBuilder
类,并且仍然使用自定义生命周期来获取结果?
我能想出的唯一解决方法是使用
但这似乎不正确。
c# - Structuremap 从子文件夹加载程序集
我有一项使用应用程序域的服务。一些独立的遗留域,通过一个主进程监督工作。
主应用程序和子进程具有不同的 IOC 容器。
使用结构图的 4.2.0.402 版本,我注意到“AssembliesAndExecutablesFromPath”正在加载所有程序集,甚至是子进程文件夹中的二进制文件 - 这导致了一些噩梦。
我可以通过使用“scanner.Exclude”来破解它,但是不得不硬编码要排除的文件夹名称感觉不对。
有什么想法或建议吗?
mapping - 在 Java 中使用 hapi-Fhir StructureMap 资源将 CDA 映射到 FHIR 资源
我正在尝试使用 structureMap 资源将 xml cda 文档映射到 Fhir 资源。这是我编写的 structureMap 资源:
但我找不到任何方法将我定义的结构映射资源链接到相应的 FHIR 资源。实际上我不知道如何使用这个结构映射并获得一个 fhir 资源。请你帮助我好吗?
c# - StructureMap 不扫描当前文件夹中的程序集
所以我在 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 我有以下内容:
当我检查已注册的程序集时,即使程序集在运行时存在,扫描仪也不会拾取使用默认约定的具体类型。
我想要达到的目标如下:
- 让扫描程序扫描目录并绑定它知道如何使用标准约定绑定的类
- 对于其余接口(尤其是不遵循任何特定约定的通用接口),使用在定义具体类型的程序集中定义的注册表
- 本质上,我想将我的底层架构视为执行环境的插件,即能够动态添加实现接口的程序集,并让 DI 容器通过使用默认约定或我在程序集中定义的注册表类来注册它们。
注意:我也尝试将scanner.LookForRegistries() 添加到扫描仪,但无济于事。
注意 #2:还有其他程序集包含 API 引用的接口,这些接口在其他程序集中的其他地方实现。扫描仪正在拾取这些,但这些依赖项的依赖项没有。
c# - StructureMap 中的这两个注册表项是否相同?
我想针对其相应的接口注册一个单例类。我发现了两种不同的方法来实现这一点:
选项1:
选项 2:
那么这两个调用是相同的还是两者之间有区别?显然,选项 1 由于其简洁性而更可取。
c# - 如何在 Structuremap RegistrationConvention 中解析实例
我使用 Structuremap 作为 IOC 容器。
在旧版本的 Structremap 中,我使用了 ObjectFactory,现在我已从以下链接更新为 Structremap.Mvc5:
https://github.com/webadvanced/Structuremap.MVC5
但我无法在 BuildRegistration 方法中创建“ISettingService”的实例。
我的 SettingConvention 课程是:
如何创建 'ISettingService' 的实例而不是编写 'ObjectFactory.Resolve()' ?
感谢大家花时间尝试帮助解释。
asp.net-mvc - 使用结构映射实现多个实现相同的接口并调用特定的类
我正在使用结构映射 IOC 容器我在这里没有使用默认名称约定的扫描。
公共接口 ICompanyRepository
我正在尝试在我的客户控制器类中使用结构映射来实现 DI,我如何告诉我需要调用公司 1 的方法或调用公司 2 的方法?
我的代码:私有只读 ICustomerRepository customerRepository;
c# - StructureMap 错误 - 未注册默认实例
我有一个使用 StructureMap IoC 容器的控制台演示应用程序。该演示将所有接口和实现都放在一个项目中的一个文件中,扫描注册表如下所示:
该演示使用约定ISomething
,Something
因此 StructureMap 可以自动找到接口的实现。
现在,当我把它移到一个有UI 项目和业务项目的真实项目时。我保持惯例,ISomething
但是Something
当我尝试在我的单元测试项目中运行集成测试时收到以下错误消息。
消息:测试方法 AbcCompany.Tests.IntegrationTestsForTasks.Get_something_test 抛出异常:StructureMap.StructureMapConfigurationException:未注册默认实例,无法自动确定类型“AbcCompany.DomainLayer.ISomething”
没有为 AbcCompany.DomainLayer.ISomething 1.) Container.GetInstance() 指定配置
如果我将注册表更改为以下内容,它将起作用:
但是,如果我保持标准命名约定,我喜欢这样,StructureMap 将为我找到我所有的接口和实现,而无需指定它们。
structuremap - Controllers的Structuremap拦截
我想使用 AOP 来拦截对 ASP.NET 控制器和 ApiControllers 中所有方法的调用。
在http://structuremap.github.io/dynamic-interception/之后,我试图让它按如下方式工作。
拦截器目前并没有做太多的事情,只是提供了一种查看方法名称及其属性的方法:
问题是如何附加它——不会出错。
我尝试了几种不同的方法,都引发了相同类型的错误..
"Decorator Interceptor failed during object construction. Specified type is not an interface,Parameter name: interfaceToProxy"
问题是 ASP.MVC 直接要求控制器(例如:“AboutController”,而不是“IAboutController”)。
我在用着:
感谢您对如何进行的任何建议。
PS:我不确定我是否完全理解https://stackoverflow.com/a/47582778/9314395的建议,但以下内容并没有神奇地产生任何拦截: