2017-12-22 21 views
2

.NET Core WebApp에서 서비스 계층을 구현하고 싶습니다.하지만 생성자 종속성 주입에 대한 몇 가지 문제점이 있습니다. 어쩌면 누군가 내 실수를 보여줄 수 있습니다..NET 핵심 웹 응용 프로그램에서 서비스 계층 작성. 생성자 DI가 작동하지 않습니다

서비스에 대한 아이디어는 비즈니스 로직을 보유하고 있으며 리포지토리에만 이야기하는 것입니다. 모든 서비스는 자체 책임을지고 있기 때문에, 비즈니스 과제를 수행해야하는지에 따라 리포지토리뿐만 아니라 다른 서비스와도 이야기해야합니다.

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)); 
    ... 

:

내가 이렇게 먼저 내 저장소를 등록이 작업을 수행하려면

IHardwareDataService.cs

,515,
public interface IHardwareDataService 
{ 
    Task<Boolean> UpdateHardwareData(HardwareData hardwareData); 
} 

HardwareDataService.cs

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) 
    } 
} 

문제점

은 "IDeviceService"문제없이 작동한다. "IHardwareDataService"이 아닙니다. 정확하게 "IDeviceService"이라는 개체는 null입니다.

나는 Constructor Dependency Injection을 통해 다른 서비스에 서비스를 제공 할 수없는 것처럼 보이지만, 왜 그리고 어떻게 올바른 방법으로 만들지 이해하지 못합니다.

이 문제를 해결할 수있는 방법에 대한 팁이 있습니까?

답변

4

이 시나리오에서는 공급자를 만들 필요가 없습니다.

검토 당신은 구현을 해석 할 때 프레임 워크가 필요한 의존성을 주입합니다

services.AddScoped<IDeviceService, DeviceService>(); 
services.AddScoped<IHardwareDataService, HardwareDataService>(); 

에 간단하게 할 수있는 서비스를 ... 등록 방법에 대해 설명합니다.

참조 : Introduction to Dependency Injection in ASP.NET Core: Registering Your Own Services

+0

작품을 교체하려고합니다. 당신의 도움을 주셔서 감사합니다. 내가 정확히 100 % 왜 지금 작동하는지 확실하지 않기 때문에 당신이 제공 한 링크를 명확히 살펴볼 것입니다. –

2

이제 마법처럼

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>() 
     )); 

services.AddScoped<IDeviceService,DeviceService >(); 
services.AddScoped<IHardwareDataService,HardwareDataService>();