我有以下项目:
计划是在API和WPF应用程序之间共享服务层。 在Web API中,我添加了一个有范围的UnitOfWork服务,该服务本身使用了有范围的DbContexts
services.AddScoped<IUnitOfWork, UnitOfWork>();
服务层使用UnitOfWork在一个事务中跨服务提交多个查询(添加了作用域)。这可以按预期工作。
Service1:
public Service1(IService2 service2,IUnitOfWork unitOfWork)
{
...
}
public async DoSomething()
{
_unitOfWork.DBContext.SomeTable.Add(new SomeTableRecord())
_service2.AddSomeDbRecord(saveInstant:false); //adds a record in another table without saving
await _unitOfWork.SaveAllChanges(); //saves both db changes (inserts) in one transaction
}
服务2:
public Service2(IUnitOfWork unitOfWork)
{
...
}
public async AddSomeDbRecord(bool saveInstant)
{
_unitOfWork.DBContext.SomeTable2.Add(new SomeTable2Record())
if(saveInstant)
await _unitOfWork.SaveAllChanges(); //saves both db changes (inserts) in one transaction
}
现在,当我添加WPF项目时,如果我不再具有“ WebRequest”的范围,那么定义范围的好方法就是什么。理想情况下,我希望范围是对Services方法的整个调用链。
我相信这会做我想做的事
using (var serviceScope = Host.Services.CreateScope())
{
var services = serviceScope.ServiceProvider;
var service1 = services.GetRequiredService<Service1>();
service1.DoSomething();
}
...但是对于每次对服务库的调用来说,这显然不是很好或不容易写,我不能为服务使用ViewModel构造函数注入。
每个ViewModel实例的作用域也可以,但是我不知道该怎么做(我将MVVM Pattern与ViewModelLocator一起使用)
我想保留Microsoft.Extensions.DependencyInjection作为DI框架,因为这也是我在ASP.Net项目中使用的框架。