ASP.Net Core 2.2 웹 앱을 리팩터링하고 있습니다. 일부 기능을 별도의 클래스 라이브러리 (.net core 2.2) 프로젝트로 옮기기로 결정했습니다. 클래스 라이브러리에는 System.IO.Abstractions에 대한 종속성이 있으므로 단위 테스트가 가능합니다. 클래스 라이브러리의 단순화 된 버전은 다음과 같습니다.
using System;
using System.IO.Abstractions;
namespace ClassLibrary1
{
public class TestService
{
private IFileSystem fileSystem;
internal TestService(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
public TestService() : this(new FileSystem()) {}
}
}
웹 애플리케이션 프로젝트에서 클래스 라이브러리 dll에 대한 참조를 추가했습니다. Startup.cs에서 using 문을 추가하고 ConfigureServices에서 DI 컨테이너에 TestService (클래스 라이브러리에 정의 됨)를 등록합니다.
...
using ClassLibrary1;
namespace WebApplication1
{
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<TestService>();
}
...
}
}
다음과 같이 컨트롤러에서 서비스를 인스턴스화하려고합니다.
using ClassLibrary1;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
TestService service;
public HomeController(TestService service)
{
this.service = service;
}
...
}
}
이 프로젝트를 실행할 때 다음 오류가 발생합니다.
FileNotFoundException : 'System.IO.Abstractions, 버전 = 7.0.0.0, Culture = neutral, PublicKeyToken = 96bf224d23c43e59'파일 또는 어셈블리를로드 할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다.
System.IO.Abstractions 패키지를 webapp 프로젝트에 추가하지 않고 어떻게 해결합니까?
내 이해는 DI를 사용하여 해결하려는 클래스의 생성자에 외부 종속성 인 IFileSystem 유형이 포함되어있어 웹 앱이 해결할 수 없기 때문에 문제가 발생한다는 것입니다.
이 문제에 대한 해결책을 찾은 후 시도한 한 가지는 필요한 종속성을 등록하는 클래스 라이브러리에 확장 메서드를 추가하는 것입니다.
using Microsoft.Extensions.DependencyInjection;
using System.IO.Abstractions;
namespace ClassLibrary1
{
public static class IServiceCollectionExtension
{
public static IServiceCollection AddTestService(this IServiceCollection services)
{
services.AddScoped<IFileSystem, FileSystem>();
services.AddScoped<TestService>();
return services;
}
}
}
그런 다음 다음과 같이 웹앱의 ConfigureServices에서이 확장 메서드를 사용합니다.
services.AddTestService();
그러나 이로 인해 동일한 오류 메시지가 나타납니다.
편집하다:
내가 가진 진짜 질문은 종속성에 대해 걱정하지 않고 사용할 수 있도록 클래스 라이브러리를 올바르게 작성하는 방법입니다.
따라서 webapp에서 TestService는 공용 매개 변수없는 생성자를 사용하여 인스턴스화되어야하며 xunit 프로젝트의 classlib 솔루션 내에서 TestService는 내부 생성자를 사용하여 인스턴스화 될 수 있습니다.
클래스 라이브러리에서 종속성을 해결해서는 안됩니다. 컴포지션 루트 는 기본 응용 프로그램에만있을 수 있습니다. 컴포지션 루트는 개체 그래프를 설정할 수있는 응용 프로그램 수명주기의 시작 및 가장 빠른 지점입니다.
Startup.cs
ASP.NET Core 애플리케이션의 컴포지션 루트도 마찬가지 입니다.
services.AddScoped<IFileSystem, FileSystem>();
클래스 라이브러리에는 컴포지션 루트가 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다