将委托传递到 servicecollection C# Web API

问题描述 投票:0回答:1

我正在尝试将方法从我的调用 API 项目传递到库中。该库需要接收指向具有其他依赖项的非静态类中的方法的指针。该库在后台进程中调用 API 方法(在动态地将方法作为委托传递之前已成功运行)。当类库在项目之间共享时,我不希望调用 API 必须实现库中的接口,而是将方法传递给它(如果这是最佳选择,可以使用委托

我收到一个空引用异常,其中包含 SummaryService 中所需的依赖项(在其他地方注册为 Scoped)。

尝试尽可能简短地摘录一些代码,但是动态指定要运行的方法、使用后台服务以及围绕生命周期范围的普遍混乱等存在一些依赖性和复杂性。

我有以下代码,使用 Func 表达式让我的库知道要使用什么方法 -program.cs

MethodInfo method = typeof(SummaryService).GetMethod("Delete");
                Func<string, Task> deletionFunc = (Func<string, Task>)Delegate.CreateDelegate(typeof(Func<string, Task>),null, method);
                builder.Services.AddServiceBusUserAccountDataDeletion("ServiceBusConsumerConfig", deletionFunc);

我的类库中有以下扩展方法。

public static IServiceCollection AddServiceBusUserAccountDataDeletion(
          this IServiceCollection services, string configSectionPath,Func<string, Task> deleteMethod)
        {
services.AddScoped<IDeletionService, DeletionService>(sp => new DeletionService(deleteMethod));
}

这是我的库中的删除服务,应该调用我的 API 项目中的 SummaryService Delete 方法。

public class DeletionService : IDeletionService
{
    private readonly Func<string, Task> _callBack;

    public DeletionService(Func<string, Task> callBack)
    {
        _callBack = callBack;
    }
    public async Task Delete(string userId)
    {
        await _callBack(userId).ConfigureAwait(false);
    }
}

有什么明显的事情需要我更改/添加,或者有更好的方法来完全实现这一点吗?

c# delegates
1个回答
1
投票

您可以在注册 DeletionService 时尝试通过服务提供者获取 SummaryService 的正确实例,如下所示:

services.AddScoped(sp => 
{
    var summaryService = sp.GetRequiredService<SummaryService>();
    return new DeletionService(summaryService.Delete));
});
© www.soinside.com 2019 - 2024. All rights reserved.