问题标签 [scrutor]
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.
asp.net-core - 如何在 Scrutor 类似的 StructureMap 中注册程序集上的所有接口
如何在带有scan扩展名的程序集中注册所有接口,而不用在 ASP.NET Core 2 中全部分开?
在结构图中:
在 Scrutor 中:
asp.net-core - 从 ASP.NET Core 填充 Application Insights 中的用户 ID 字段
我希望能够使用我的真实用户名数据填充 Application Insights 中的用户 ID 字段。这是一个内部应用程序,因此简单用户名字段的隐私问题没有实际意义。
据我所知,所有在线可用的解决方案都严格适用于 .NET Framework,而不是 .NET Core。
你可以在几个地方找到这个解决方案,包括 GitHub 上的一些旧 AI 文档。但是,当我运行它时,我在启动时收到一个错误,表明单例不能接受对作用域对象 IHttpContextAccessor 的依赖,这当然是合乎逻辑的。除非以前版本的 .NET Core 的 DI 允许(我在 2.2 上),否则我看不出这是如何工作的。
GitHub 上的这个问题有点说明问题,但在 AI 团队指出你必须使用单例后,它被关闭了。我尝试了 OP 和第一个响应中的内容的变体,当代码运行时,AI 上的 User Id 字段继续充满乱码数据。
有没有办法让 AI 中的 User Id 字段填充一些对来自 ASP.NET Core 应用程序的服务器请求有用的东西?
编辑
在看到下面我的代码应该可以正常工作的答案后,我回过头来意识到异常消息没有特别提到 IHttpContextAccessor:
System.InvalidOperationException: “不能从单例“Microsoft.Extensions.Options.IConfigureOptions`1 [Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration]”使用范围服务“Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer”。”
现在,我的代码看起来与下面@PeterBons 的答案几乎相同,所以从表面上看,这个异常没有任何意义。 TelemetryConfiguration没有事件出现在我的代码中。但后来我记得我在 Startup 中使用 Scrutor 懒惰地进行 DI 注册:
我认为问题是我需要将我的 ITelemetryInitializer 注册为 Singleton,并且此代码无意中将其取消或重新注册为作用域。所以我将最后两行更改为:
它奏效了。而不是编辑我上面的错误,我会留下它。@PeterBons 在下面的回答仍然对其他人有所帮助,也许我对 Scrutor 的困惑也会对其他人有所帮助。
asp.net-core - 只在 Scrutor 中直接继承接口的类注册接口
我正在使用Scrutor在我的程序集中注册所有实现接口的类型。但是,我想排除继承实现接口的非抽象类型的类型。
我有一个类似于以下的代码结构(为简洁起见,省略了所有类型成员):
在Startup.ConfigureServices:
这会导致两个注册IBar,一个是实现类型Bar,一个是实现类型Foobar。我想要的是我得到的IFoobar(解析为Foobar)的一个注册,但只有一个IBar解析为Bar.
Foobar派生自,Bar因为它需要Barwhile IFoobarextends中的功能IBar。
有没有办法确保接口只向直接继承它的类而不是通过基类注册一次?
c# - 为什么我会收到此 InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.RequestDelegate”的服务?
我刚刚将我的 ASP.NET Core WebApi 项目从 .NET Core 2.2升级到3.1。
我已经修复了所有编译时错误,升级了我的 Nuget 包,现在我可以运行该应用程序了。
但是,当我调用Build()myIHostBuilder时,出现以下异常:
InvalidOperationException:尝试激活“MyProject.Api.Middleware.ExceptionHandlerMiddleware”时,无法解析“Microsoft.AspNetCore.Http.RequestDelegate”类型的服务。
它所指的中间件是相当标准的。
ExceptionHandlerMiddleware.cs
我的应用程序初始化的其余部分是相当标准的,从 2.2 到 3.1(2.2 正在工作)我没有太大变化。
我确实从 更改services.AddMvc()为services.AddControllers()。
程序.cs
还值得一提的是,ConfigureServices()方法 inStartup.cs被调用并且运行良好,但Configure() 从未运行。该Build()方法总是在应用程序到达Configure().
我的 Startup 的Configure方法签名如下所示:
c# - 使用 Scrutor 自动解析 DI
我有ExperienceAppService实现接口的应用服务IExperienceAppService。
我尝试使用 Scrutoк 进行自动注册
我在启动文件中有这段代码
它应该注册接口。但我得到了这个错误
尝试激活“TooSeeWeb.Controllers.ExperienceController”时无法解析“TooSeeWeb.Core.Interfaces.Experiences.IExperienceAppService”类型的服务。
我的麻烦在哪里?
c# - 无法解析通过程序集扫描注册的服务
配置
我有 :
- 一个 .net 核心 MVC 应用程序项目
- 一个模块项目包含
- 一个控制器(MyController),
- 存储库接口(IMyRepository)
- 一个存储库(实现 IMyRepository 和 IRepository 的 MyRepository)
.net 核心应用程序引用了模块项目
我在 MVC 应用程序中使用 Scrutor 来获取IRepositoy在任何引用项目中实现的所有类,并将它们注册到服务集合中:
问题
如果我检查服务集合,我可以看到IMyRepository已注册并且应该解析为MyRepository。但是,将存储库注入MyController时,如下所示:
抛出错误:
尝试激活“MyController”时无法解析“IMyRepository”类型的服务。
除非...
通过 Scrutor 注册存储库后,我把
此时一切都按预期工作。但这破坏了自动依赖注册的全部意义。
非常感谢任何帮助。
c# - 用一个打开的泛型接口注册一个封闭的泛型类实现
我刚刚意识到,您不能像这样注册依赖注入:
DI 禁止使用泛型接口注册非泛型类。
是否有任何 3rd 方 DI 库可以使注册成为DepartmentRepository可能IConcreteRepository<,>?
无论库是什么,我都需要解决这个问题——如果可以使用默认的 .NET Core 3 框架,那就太好了,但是如果有任何 3rd 方库可以使这成为可能,我也可以。
编辑:
我应该提一下,像这样注册会引发以下异常:
c# - 在 .netCore 3.1 中使用 Scrutor 装饰 BaseController
我在 .net core 3.1 中有一个带有角前端的应用程序。我想将装饰器用于基本控制器,以便在整个应用程序中记录 CUD 操作。我在项目中使用 Scrutor nuget 包。
基本控制器如下
我做的装饰器如下
在public void ConfigureServices(IServiceCollection)我使用以下几行的启动类中
在所有先前的操作之上,我已经从基本控制器中提取了一个接口。当应用程序运行时,它不会调用/传递装饰器。我在这里缺少什么?我以前没有将装饰器模式与 .net 核心和依赖注入一起使用。所有添加的代码都只在后端,我根本没有改变前端。
先感谢您。
c# - 实现 Scrutor 但仅在少数方法上扩展缓存
我计划实施 Scrutor
实现缓存存储库:
这就是我如何做DI:
我看到的问题是 ICustomerRepository 同时具有 GetCustomerAsync 和 SaveCustomer 方法,我可以在 CacheCustomerRepository 中实现 ICustomerRepository 并定义 GetCustomerAsync 方法,但是我怎么能忽略 SaveCustomer,因为它不能作为 CacheCustomerRepository 类中的缓存方法。如果我没有在 CacheCustomerRepository 中定义该方法,我将收到错误,因为缺少接口的实现,如何以干净的方式实现 scrutor,有没有一种方法只实现少数需要缓存的方法,其余的可以在主要存储库类?
我可以想到只在 CacheCustomersRepository 中包含用于保存方法的骨架,但它是一种干净的方法吗,而且如果我的 CustomerRepository 有 50 个方法,其中只有 5 个方法需要缓存实现,那么它是非常多余的,不是一个好方法缓存存储库中的所有骨架方法。
我们如何以干净的方式实施 Scrutor?有什么建议么 ?
dependency-injection - 向 Scrutor 注册 Open Generic Decorator
我有一个标准的 .Net 核心 Api,并希望使用 Open Generic IReposistory 并使用 DomainEventPublisher 进行装饰,以便在持久后将事件推送到 servicsBus。但是,我很早以前就使用过 Simple Injector,这是我的忠实粉丝。但是现在当使用 MediatR 时,我试图通过仅使用 .net Core DI 和 Scrutor 包进行装饰来简化 DI。
问题是我得到的一个错误:“提供的泛型参数的数量不等于泛型类型定义的数量。” 尝试在 Startup 中注册装饰器时来自 Scrutor(下面的第 2 行)。
我已经关闭了这些通用类/接口,然后它就可以工作了。但我不擅长那个。我会像以前在 Simpleinjector 中那样以正确的方式注册开放的通用装饰器。
有什么建议可能是什么问题?
