WPF核心依赖项注入范围

时间:2020-06-02 05:01:44

标签: wpf dependency-injection scopes

我有以下项目:

  1. .Net Standard 2.0服务库
  2. Asp.Net Web API项目
  3. WPF Core 3.1应用程序

计划是在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项目中使用的框架。

0 个答案:

没有答案