我有一个控制台应用程序,取决于不同的项目(我使用DependsOn()
[DependsOn(
typeof(AbpAutofacModule),
typeof(SecondProjectModule),
// Other dependencies
)]
public class MyConsoleAppModule...
然后,我的控制台应用程序在第二个项目中调用一个方法,在那里我尝试使用服务提供商获得一个IRepository,如下所示:
using (var scope = SecondProjectModule.GetScope())
{
using (var uow = scope.ServiceProvider.GetService<IUnitOfWorkManager>().Begin())
{
var repo = scope.ServiceProvider.GetService<IReadOnlyRepository<MyEntity>>();
return ... // LINQ here
}
}
但是repo是空的null用于DbContext和其他属性。如果我用我的WebApp项目调用这个方法,它会完美地运行。
在SecondProjectModule中的GetScope()方法非常简单:
public static IServiceScope GetScope(IServiceProvider serviceProvider = null)
{
var provider = serviceProvider ?? _serviceProvider;
return provider?
.GetRequiredService<IHybridServiceScopeFactory>()
.CreateScope();
}
不确定问题在哪里,因为我的ConsoleApp项目的依赖关系似乎很好。
存储库的实现位于EfCore或MongoDB第二个模块的图层
Web应用工作得很好,因为它依赖于数据库集成层(EfCore或MongoDB),其中包含存储库的实现。
假设你的SecondProjectModule是一个应用服务,你需要一个引用,并依赖于该模块(EfCore或MongoDB)的数据库集成层。
你可以查看有关分层的文档,并注意到应用服务没有任何依赖于EfCore或MongoDB。