首页 > 解决方案 > 为 Azure 函数重用 ABP 框架的依赖项

问题描述

我正在使用 .NET 5 扩展具有隔离 Azure 功能的 ABP 商业应用程序,并希望从 ABP 框架本身注入数据。

这是我的代码:

public class MyAzureFunction
{
    private readonly IMyRepository _myRepository;

    public MyAzureFunction(IMyRepository myRepository) 
    {
        _myRepository = myRepository;
    }

    [Function("MyAzureFunction")]
    public async Task Run([TimerTrigger("0 */15 * * * *")] TimerInfo myTimer, FunctionContext context)
    {
        ILogger logger = context.GetLogger("MyAzureFunction");
        logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        List<object> result = await _myRepository.GetAllAsync();

        // Keep going...
    }
}

这是我Program的 Azure Function 项目课程中的代码:

public class Program
{
    public static void Main()
    {
        IHost host = new HostBuilder()
            .ConfigureServices(services =>
            {
                services
                    .AddDbContext<MyAppDbContext>(OptionsAction, ServiceLifetime.Transient);
                    // `MyAppDbContext` inherits from `AbpDbContext<MyAppDbContext>` and implements 
                    // `IIdentityProDbContext` and `ISaasDbContext`.

                services
                    .AddScoped<IDbContextProvider<MyDbContext>, UnitOfWorkDbContextProvider<MyDbContext>>() // added on 2021-11-05
                    .AddScoped<IMyRepository, MyRepository>();
            })
            .ConfigureFunctionsWorkerDefaults()
            .Build();

        host.Run();
    }

    private static void OptionsAction(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(
            Environment.GetEnvironmentVariable("DatabaseConnectionString"), 
            (optionActions) => 
            {
                optionActions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
                optionActions.CommandTimeout(10);
            }
        );
    }
}

该类MyRepository继承自EfCoreRepository<MyAppDbContext, Foo, Guid>

public class MyRepository : EfCoreRepository<MyAppDbContext, Foo, Guid>, IMyRepository
{
    public ExternalSourceRepository(IDbContextProvider<MyAppDbContext> dbContextProvider) : base(dbContextProvider)
    { }

    public class Task<List<Foo>> GetAllAsync() 
    {
        // Logic here.
    }
}

问题是当我运行该功能时。

Volo.Abp.EntityFrameworkCore.IDbContextProvider<MyNamespace.EntityFrameworkCore.MyAppDbContext>System.InvalidOperationException:尝试激活时无法解析服务类型MyNamespace.Foos.MyRepository

有没有办法重用 ABP 框架本身的依赖关系?

我还尝试创建另一个IMyRepository不继承自的声明,EfCoreRepository<MyAppDbContext, Foo, Guid>但这里的问题是我无法访问ExtraPropertyDictionary对象类型的东西。

public class MyRepository : IMyRepository
{
    private readonly MyAppDbContext _myAppDbContext;

    public ExternalSourceRepository(MyAppDbContext myAppDbContext)
    {
        _myAppDbContext = myAppDbContext;
    }

    public class Task<List<Foo>> GetAllAsync() 
    {
        // Logic here.
    }
}

2021-11-05 更新:我也尝试注册IDbContextProvider<MyDbContext>UnitOfWorkDbContextProvider<MyDbContext>,但后来我遇到了这个异常:

Volo.Abp.Uow.IUnitOfWorkManagerSystem.InvalidOperationException:尝试激活时无法解析服务类型Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider<MyNamespace.EntityFrameworkCore.MyDbContext>

如果依赖项的所有依赖项都已注册,它是否可以工作,但它们是什么以及如何完成?

旁注:这个问题继续我之前的一个Azure Functions with dependency injection through constructor don't find job functions

标签: c#dependency-injectionazure-functions.net-5abp

解决方案


推荐阅读