Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET Core WebApp中构建服务层。我不工作了_C#_Entity Framework_Dependency Injection_.net Core_Constructor Injection - Fatal编程技术网

C# 在.NET Core WebApp中构建服务层。我不工作了

C# 在.NET Core WebApp中构建服务层。我不工作了,c#,entity-framework,dependency-injection,.net-core,constructor-injection,C#,Entity Framework,Dependency Injection,.net Core,Constructor Injection,我想在我的.NET核心WebApp中实现一个服务层,但我在构造函数依赖项注入方面有一些问题,不知道我做错了什么。也许有人能告诉我我的错误 关于服务的想法是,它们持有业务逻辑,并且是唯一与存储库对话的服务。由于每个服务都有自己的责任,因此他们不仅要与存储库对话,还要与其他服务对话,这取决于必须完成的业务任务 为此,我首先注册存储库,如下所示: var serviceProvider = services.BuildServiceProvider(); services.AddSco

我想在我的.NET核心WebApp中实现一个服务层,但我在构造函数依赖项注入方面有一些问题,不知道我做错了什么。也许有人能告诉我我的错误

关于服务的想法是,它们持有业务逻辑,并且是唯一与存储库对话的服务。由于每个服务都有自己的责任,因此他们不仅要与存储库对话,还要与其他服务对话,这取决于必须完成的业务任务

为此,我首先注册存储库,如下所示:

    var serviceProvider = services.BuildServiceProvider();
    services.AddScoped<IDeviceService>(r => new DeviceService(
        serviceProvider.GetService<IDeviceRepository>(),
        serviceProvider.GetService<IMasterDataRepository>(),
        ));

    services.AddScoped<IHardwareDataService>(r => new HardwareDataService(
        serviceProvider.GetService<IDeviceService>(),
        serviceProvider.GetService<IHardwareDataRepository>()
        ));
    ...
}
Startup.cs

public void ConfigureServices(IServiceCollection services) {
    this.storageConnectionString = "Server=.;Initial Catalog=MyDatabase;Integrated Security=True;";
    services.AddScoped<IDeviceRepository>(r => new EntityDeviceRepository(this.storageConnectionString));
    services.AddScoped<IMasterDataRepository>(r => new EntityMasterDataRepository(this.storageConnectionString));
    ...
public interface IHardwareDataService
{
    Task<Boolean> UpdateHardwareData(HardwareData hardwareData);
}
public class HardwareDataService : BaseService, IHardwareDataService
{
    private IDeviceService deviceService;
    private IHardwareDataRepository hardwareDataRepository;

    public HardwareDataService(IDeviceService deviceService, IHardwareDataRepository hardwareDataRepository)
    {
        this.deviceService = deviceService;
        this.hardwareDataRepository = hardwareDataRepository;
    }

    public async Task<Boolean> UpdateHardwareData(HardwareData hardwareData)
    {
        // Create the Device via the Device Service if not already existing (Business Logic)
        // Update Hardware Data of Device (Business Logic + direct Access via HWDataRepository)
    }
}
public void配置服务(IServiceCollection服务){
this.storageConnectionString=“Server=;Initial Catalog=MyDatabase;Integrated Security=True;”;
services.AddScoped(r=>newEntityDevicePository(this.storageConnectionString));
addScope(r=>newEntityMasterDataRepository(this.storageConnectionString));
...
(在相同的文件和函数中)我注册我的服务如下:

    var serviceProvider = services.BuildServiceProvider();
    services.AddScoped<IDeviceService>(r => new DeviceService(
        serviceProvider.GetService<IDeviceRepository>(),
        serviceProvider.GetService<IMasterDataRepository>(),
        ));

    services.AddScoped<IHardwareDataService>(r => new HardwareDataService(
        serviceProvider.GetService<IDeviceService>(),
        serviceProvider.GetService<IHardwareDataRepository>()
        ));
    ...
}
var serviceProvider=services.BuildServiceProvider();
AddScoped(r=>new DeviceService(
serviceProvider.GetService(),
serviceProvider.GetService(),
));
AddScoped(r=>新的硬件数据服务(
serviceProvider.GetService(),
serviceProvider.GetService()
));
...
}
IHardwareDataService.cs

public void ConfigureServices(IServiceCollection services) {
    this.storageConnectionString = "Server=.;Initial Catalog=MyDatabase;Integrated Security=True;";
    services.AddScoped<IDeviceRepository>(r => new EntityDeviceRepository(this.storageConnectionString));
    services.AddScoped<IMasterDataRepository>(r => new EntityMasterDataRepository(this.storageConnectionString));
    ...
public interface IHardwareDataService
{
    Task<Boolean> UpdateHardwareData(HardwareData hardwareData);
}
public class HardwareDataService : BaseService, IHardwareDataService
{
    private IDeviceService deviceService;
    private IHardwareDataRepository hardwareDataRepository;

    public HardwareDataService(IDeviceService deviceService, IHardwareDataRepository hardwareDataRepository)
    {
        this.deviceService = deviceService;
        this.hardwareDataRepository = hardwareDataRepository;
    }

    public async Task<Boolean> UpdateHardwareData(HardwareData hardwareData)
    {
        // Create the Device via the Device Service if not already existing (Business Logic)
        // Update Hardware Data of Device (Business Logic + direct Access via HWDataRepository)
    }
}
公共接口IHardwareDataService
{
任务更新硬件数据(硬件数据硬件数据);
}
HardwareDataService.cs

public void ConfigureServices(IServiceCollection services) {
    this.storageConnectionString = "Server=.;Initial Catalog=MyDatabase;Integrated Security=True;";
    services.AddScoped<IDeviceRepository>(r => new EntityDeviceRepository(this.storageConnectionString));
    services.AddScoped<IMasterDataRepository>(r => new EntityMasterDataRepository(this.storageConnectionString));
    ...
public interface IHardwareDataService
{
    Task<Boolean> UpdateHardwareData(HardwareData hardwareData);
}
public class HardwareDataService : BaseService, IHardwareDataService
{
    private IDeviceService deviceService;
    private IHardwareDataRepository hardwareDataRepository;

    public HardwareDataService(IDeviceService deviceService, IHardwareDataRepository hardwareDataRepository)
    {
        this.deviceService = deviceService;
        this.hardwareDataRepository = hardwareDataRepository;
    }

    public async Task<Boolean> UpdateHardwareData(HardwareData hardwareData)
    {
        // Create the Device via the Device Service if not already existing (Business Logic)
        // Update Hardware Data of Device (Business Logic + direct Access via HWDataRepository)
    }
}
公共类硬件数据服务:BaseService、IHardwareDataService
{
私人idevice服务设备服务;
私有iHardware数据仓库硬件数据仓库;
公共硬件存储服务(IDeviceService deviceService,i硬件存储硬件存储)
{
this.deviceService=设备服务;
this.hardwareDataRepository=hardwareDataRepository;
}
公共异步任务更新硬件数据(硬件数据硬件数据)
{
//如果尚未存在,则通过设备服务创建设备(业务逻辑)
//更新设备的硬件数据(业务逻辑+通过HWDataRepository直接访问)
}
}
问题

IDeviceService
”工作正常。 “
IHardwareDataService
”不可用。确切地说,对象“
IDeviceService
”是
null

似乎我不能通过构造函数依赖项注入将一个服务提供给另一个服务,但我不明白为什么以及如何以正确的方式提供服务


关于如何解决此问题的任何提示?

在这种情况下,确实不需要构建提供程序

查看您注册服务的方式,可以简化为

services.AddScoped<IDeviceService, DeviceService>();
services.AddScoped<IHardwareDataService, HardwareDataService>();
services.addScope();
services.addScope();
在解析实现时,框架将注入必要的依赖项

参考资料:

尝试更换

 var serviceProvider = services.BuildServiceProvider();
    services.AddScoped<IDeviceService>(r => new DeviceService(
        serviceProvider.GetService<IDeviceRepository>(),
        serviceProvider.GetService<IMasterDataRepository>(),
        ));

    services.AddScoped<IHardwareDataService>(r => new HardwareDataService(
        serviceProvider.GetService<IDeviceService>(),
        serviceProvider.GetService<IHardwareDataRepository>()
        ));
var serviceProvider=services.BuildServiceProvider();
AddScoped(r=>new DeviceService(
serviceProvider.GetService(),
serviceProvider.GetService(),
));
AddScoped(r=>新的硬件数据服务(
serviceProvider.GetService(),
serviceProvider.GetService()
));

services.addScope();
services.addScope();

现在很有魅力。谢谢你的帮助。我会仔细查看你提供的链接,因为我不能100%确定为什么它现在能正常工作。