问题标签 [dryioc]
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# - 如何使用 DryIoc 解决 WebAPI 控制器的依赖关系
我一直在阅读文档,我对如何实现这一点有点困惑。我有一个名为 NewsController 的 WebAPI 控制器,我将在下面列出。它有一个构造函数,当前需要三个依赖项。我为 DryIoc 创建了一个静态类,因此我可以在整个项目中全局使用它,并且它在启动时被初始化。
我想做的是在我的 DryIoc 类中注册控制器及其依赖项,然后以某种方式在 NewsController 控制器中解决它。我想这样做的原因是,当我开始测试时,我可以简单地让测试项目更改注册控制器的范围并使用存根或模拟实现。
注册依赖项
NewsController(无论如何都是它的一部分)
更新:
到目前为止,我通过 WebApiConfig 进行了“自动”依赖解析,但我不确定如何从测试项目中访问它,因此我可以用我的存根替换真正的实现。
WebApiConfig
注册依赖项
新闻控制器
c# - 注册不解决
.Net Core 框架的自动解析没有在 DryIoC 中找到我的注册。
这使用了新的 .Net Core 2 框架,DryIoC 2.10.7 和 DryIoc.Microsoft.DependencyInjection 1.2.2。我无法更新到 DryIoC 2.11.7,因为 DryIoc.Microsoft.DependencyInjection 没有获取最新版本。我确实尝试在 2.11.7 安装后重新安装后者,但这不起作用(参考不明确)。
这是我的启动代码:
这是我的注册码:
最后是控制器:
这是一个例外:
System.InvalidOperationException:尝试激活“DataDictionaryService.Controllers.AdminController”时无法解析“SharedAssets.Interfaces.ILogging”类型的服务。在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact
1 callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type serviceType, Type implementationType, ISet
(ServiceDescriptor 描述符, 类型 serviceType, ISet1 callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType, ISet
1 callSiteChain) 在 Microsoft.Extensions .DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(类型 serviceType,ISet1 callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(Type serviceType, ServiceProvider serviceProvider) at System.Collections.Concurrent.ConcurrentDictionaryExtensions.GetOrAdd[TKey,TValue,TArg](ConcurrentDictionary
2 字典,TKey 键,Func`3 valueFactory,TArg arg) 在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 在 Microsoft.AspNetCore。 Mvc.Controllers.ServiceBasedControllerActivator.Create(ControllerContext actionContext) at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.g__CreateController0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14 中的对象和状态、布尔值和已完成)。MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.AspNetCore 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() .Mvc.Internal.ResourceInvoker.d__22.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc.Internal 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17 中 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 中的 ResourceInvoker.Rethrow(ResourceExecutedContext context)。MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.AspNetCore 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() .Mvc.Internal.ResourceInvoker.d__15.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 处从先前引发异常的位置结束堆栈跟踪。 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() 处的 HandleNonSuccessAndDebuggerNotification(Task task) --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System .Runtime.CompilerServices。Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.d__7.MoveNext() 处的 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext() 上的 HandleNonSuccessAndDebuggerNotification(任务任务)Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext() 上的 HandleNonSuccessAndDebuggerNotification(任务任务)
谢谢!
c# - 如何在 DryIoC 中删除(设置为 null)已注册的单例类型?
我需要完全删除已由 DryIoC 容器解析的实例(但不取消注册类型)。我不知道这是否可能?
如果我不使用任何 IoC 容器并且只自己声明单例,我当然可以随时轻松地将其重置为 null。
例如:
这里的场景是在用户注销我的应用程序后,我想清除所有已解析的单例,这样如果用户使用另一个帐户(甚至使用同一个帐户)重新登录,数据将被正确刷新。目前无法清除那些单例,我必须自己手动重置所有属性——我认为这应该是最后的手段。
c# - 使用 Reuse.InWebRequest/Reuse.InThread 时使用 DryIoc 解析新实例
我在 WebApi 项目中使用 DryIoc。默认重用设置为 Reuse.InWebRequest。在某些情况下,我需要在请求期间解析新实例。使用 Reuse.InCurrentScope 时,我可以像这样解析新实例:
但是当使用 Request.InWebRequest 或 Request.InThread (根据文档基本相同)时,不会创建新实例,而是重用已解析的实例。我也尝试使用IContainer.CreateFacade()
,但结果是一样的。
我想知道是否有一种方法可以强制创建新实例(无论指定的重用如何),而无需从头开始创建新容器。
更新澄清
我不能使用 Reuse.Transient,因为在 99% 的时间里我需要相同的实例。仅当将容器用作服务定位器时,我才需要一个新实例。
c# - DryIOC:注册泛型类型抛出:使用自动构造函数选择时未指定实现类型
我想注册一个接受 ,entity 和实体键的通用基础存储库,我有 IBaseRepo 和它的实现。我在下面使用了这行代码
但我得到以下错误
InvalidOperationException:尝试创建“ValuesController”类型的控制器时发生错误。确保控制器有一个无参数的公共构造函数。
内部异常:
DryIoc.ContainerException:使用自动构造函数选择时未指定实现类型:IRepository {ReturnDefault} 作为参数“用户”
在 UserRepository 中:IUserRepository {ReturnDefault} 作为参数“repository”
在作用域 ValuesController {ServiceKey=DefaultKey(0), ReturnDefault}
xamarin.forms - 将 Lazy<> 与 Prism.DryIoc.Forms 一起使用会产生“容器被垃圾收集”异常
我们使用 Prism.DryIoc.Forms 通过 Xamarin.Forms 创建应用。为了最小化应用程序的启动时间,我们对具有大量依赖项的类使用 Lazy<> 模式。
这曾经与 Prism.Unity.Forms 一起工作得很好。但是,我无法让它与 Prism.DryIoc.Forms 一起使用。任何帮助,将不胜感激。
代码如下。我们有一个这样的页面视图模型:
然而,在页面视图模型被实例化后,当调用 _lazySomeClass.Value 时,我们得到一个异常消息“容器不再可用(已被垃圾收集)。 ”。它似乎与 Prism 如何解析视图模型有关,因为在调用以下内容时它可以正常工作:
我们正在做这样的注册:
.net - 使用 DRYIOC 注册一个类并获取返回模型的实例
我想使用 DryIoc 在 userviewmodel 中注册并获取当前用户的实例。请我如何实现这一点。这是 CurrentUserConfig 类
这就是我想要使用 DryIoc 实现的目标。这是使用 SimpleInjector 完成的
c# - 使用依赖注入时避免使用单例存储库 (DryIoc)
我最近创建了一个解决方案,并认为我会尝试使用 DryIoC 容器来处理依赖注入。现在,与我使用的许多其他 DI 解决方案一样,对象重用的默认范围是瞬态的。然而,这似乎给我正在使用的存储库模式的实现带来了问题,因为如果引用的类实现 IDisposable,则 DryIoC(和许多其他解决方案)无法将绑定注册为瞬态。结果,我暂时求助于使用Reuse.Singleton注册我的存储库。这对我来说绝对是一种代码味道,所以我希望有人可以就如何避免这种情况提出一些建议——例如,我可能在创建存储库方面做得很差。
这是我用来创建 IoC 容器的代码:
...以及一个示例存储库实现:
ioc-container - 使用 serviceKey 解决 DryIoc 中的子依赖关系失败
我想使用serviceKey来区分服务的不同实现。
代码说明:有一个ICat接口,用来“说”一只猫的“喵”字。“喵”这个词来自 ISoundProducer 的实现(它被注入到 ICat 的实现中)。
我使用相同的 serviceKey = "x" 注册了两个服务(ICat 和 ISoundProducer)。之后,我尝试解析 ICat 实例,但失败了。
这是演示代码:
这给了我一个例外:
无法将 ISoundProducer 解析为 GoodCat 中的参数“soundProducer”:ICat {ServiceKey="x"} 来自具有正常和动态注册的容器:x,{ID=28,ImplType=GoodCatSoundProducer}}
我究竟做错了什么?如何使用另一个注入的服务解析服务,而它们都具有相同的 serviceKey?