c# - 为 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.IUnitOfWorkManager
System.InvalidOperationException:尝试激活时无法解析服务类型Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider<MyNamespace.EntityFrameworkCore.MyDbContext>
。
如果依赖项的所有依赖项都已注册,它是否可以工作,但它们是什么以及如何完成?
旁注:这个问题继续我之前的一个Azure Functions with dependency injection through constructor don't find job functions。
解决方案
推荐阅读
- excel - 用第一个重复行中的最后一个重复替换第一个重复 – Excel VBA
- javascript - 使用 await 和 setTimerout 减慢 for 循环
- android - initPublisher 创建发布者对象但不初始化相机
- java - 如何在 XML 报告中显示 Gauge 消息?
- python - uWSGI 和 joblib Semaphore:Joblib 将以串行模式运行
- python - Python Tkinter:如何为椭圆形物体留下痕迹
- c++ - 在 QML 场景中显示内存中的网格
- c++ - 当没有更多工作要做时,防止 boost::asio::io_context 返回
- angular - 用于修剪空间的角度自定义指令有效,但验证失败
- python-3.x - 如何在python中继续返回false?