동일한 인터페이스에서 파생 된 서비스가 있습니다.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
일반적으로 다른 IoC 컨테이너를 Unity
사용하면 구체적인 구현을 구체적으로 등록 할 수 Key
있습니다.
ASP.NET Core에서 이러한 서비스를 등록하고 일부 키를 기반으로 런타임에 어떻게 해결합니까?
나는 구체적인 구현을 구별하기 위해 일반적으로 사용되는 또는 매개 변수 Add
를 사용하는 서비스 메소드를 보지 못했습니다 .key
name
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
여기에서 팩토리 패턴이 유일한 옵션입니까?
Update1 여기 에서는 여러 구체적인 구현이있을 때 팩토리 패턴을 사용하여 서비스 인스턴스를 얻는 방법을 보여주는
기사를 보았습니다 . 그러나 여전히 완벽한 솔루션은 아닙니다. 내가 전화하면_serviceProvider.GetService()
메서드를 하면 생성자에 데이터를 주입 할 수 없습니다.
예를 들어 이것을 고려하십시오 :
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
_serviceProvider.GetService()
적절한 연결 문자열을 어떻게 주입 할 수 있습니까? Unity 또는 다른 IoC 라이브러리에서는 형식 등록시이를 수행 할 수 있습니다. 그러나 IOption 을 사용할 수 있지만 모든 설정을 주입해야합니다. 서비스에 특정 연결 문자열을 삽입 할 수 없습니다.
또한 다른 컨테이너 (Unity 포함)를 사용하지 않으려 고합니다. 다른 컨테이너 (예 : 컨트롤러)를 새 컨테이너에 등록해야하기 때문입니다.
또한 팩토리 패턴을 사용하여 서비스 인스턴스를 작성하는 것은 클라이언트가 여기에 세부 사항을 갖는 종속성 수가 증가하므로 DIP에 대한 것입니다. 입니다.
따라서 ASP.NET Core의 기본 DI에는 두 가지가 빠져 있다고 생각합니다.
- 키를 사용하여 인스턴스를 등록하는 기능
- 등록하는 동안 정적 데이터를 생성자에 주입하는 기능
Update1
생성자에서 일을 주입 같은 다른 문제로 이동이 구조에있는 객체를 작업에서 매우 다르다