C# 在后台任务内的作用域服务中实现工厂



我不知道标题是否有点混乱,但我正在使用严重依赖请求中的查询/标头的工厂来解决作用域服务。

示例代码:

public IRegisterer ScopedFactoryFor(Type ServiceType, Func<HttpContext, object> Factory)
{
_services.AddScoped(ServiceType, resolver =>
{
IHttpContextAccessor currentContext = (IHttpContextAccessor)resolver.GetService(typeof(IHttpContextAccessor));
return Factory(currentContext.HttpContext);
});
return this;
}

工厂Func<HttpContext, object> Factory是在应用程序中的其他地方创建的,但如前所述,它会发送的标头/查询上大量减少。

我想知道如果没有作用域上下文,是否有一种好方法可以根据另一个工厂解析相同的服务。

好吧,我的答案很简单,以不同的方式来理解架构......

这与其说是一个 DI 问题,不如说是一个实现问题(取决于抽象层(。

正如@pinkfloydx33所建议的那样,您可以编写中间件来抽象一些实现,但这似乎是后来的类型交易。

假设

  • 您在控制器/操作中收到调用

我的(tres/非常(基本实现...

public class HeaderQueryResolutionFactory : ITenancyResolutionFactory {
public TenantInfoStrategy Resolve(IHttpContext context) {
return new TenantInfoStrategy(context.Headers["tenantName"], context.Headers, context.Query); // NB. this may not be the actual names, and is just a signifier
}
}

public SomeController {
public SomeController(... ITenancyResolutionFactory tenancyResolver) {
_tenancyResolver = tenancyResolver;
}
...
[HttpPost, ... (secure etc.)...
public ResponseModel CalledAction () {
TenantInfoStrategy tenantInfo = _tenancyResolvery.resolve(context); // context = http context.
var tenantAction = await _tenantFactory(tenantInfo.TenantName, tenantInfo.Headers, tenantInfo.Query);
// do something with tenantAction, perhaps a switch to create the action and appropriate service 
_service.Act(tenantAction);
}
}

基本上,您不想直接针对输入创建解析内容,最好将提供给工厂的名称,然后确定其是否有效且有意义。

您的 DI 只需要一个解析为 ITenancyResolutionFactory 的接口

最新更新