2017-03-02 1 views
2

질문

기본 Asp.net Core IoC 컨테이너를 사용하면 인터페이스에 여러 객체 유형이 등록되어 있고 해당 인터페이스에 대한 서비스를 요청하면 IoC는 항상 등록 된 마지막 객체 유형을 반환합니다. 인터페이스? .Net 핵심 서비스 컨테이너, 인터페이스에 등록 된 마지막 서비스를받을 수 있습니까?

는 (나는 닷넷 코어 의존성 삽입 (Dependency Injection) 문서를 읽고이 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection 해결하지 않는 것 같습니다.)의 난이 인터페이스 있다고 가정 해 봅시다

데모를

을 :

interface ITest 
{ 

    void Create(int id); 
} 

과 이러한 클래스 :

public class TestOne: ITest { 
    int id; 
    public void Create(int id) { 
     this.id = id; 
    } 
} 

public class TestTwo: ITest { 
    int id; 
    public void Create(int id) { 
     this.id = id; 
    } 
} 


public class TestThree: ITest { 
    int id; 
    public void Create(int id) { 
     this.id = id; 
    } 
} 

나는 다음과 같은 코드를 작성할 경우 startup.cs에서

services.AddSingleton<ITest, TestTwo>(); 
services.AddSingleton<ITest, TestThree>(); 
services.AddSingleton<ITest, TestOne>(); 

Configure 방법 : 지금은 다음 코드를 추가 ConfigureServices 방법에 Startup.cs D에

var serviceCollection = app.ApplicationServices.GetServices<ITest>(); 

을 나는의 컬렉션을 얻을 개체 : TestTwo, TestThreeTestOne 순으로 나열됩니다. 항상이 경우 TestOne에서, 인터페이스에 등록 된 마지막 객체의 인스턴스를 반환하는 것

var service = app.ApplicationServices.GetService<ITest>(); 

다음 startup.cs에서

Configure 방법 나는이 코드를 작성하는 경우.

인터페이스에 여러 객체 유형이 등록되어 있고 IoC가 해당 인터페이스에 대한 서비스를 요청한 경우 항상이 인터페이스에 등록 된 마지막 객체 유형을 반환합니다.

+0

매번 마지막으로 가져 오는 경우에도 마지막으로 원하지 않을 때 무엇을합니까? 해당 서비스 컬렉션을 반복 할 것입니까? 내장 된 IOC 컨테이너로 각 인스턴스에 이름을 붙일 수없는 것처럼 보입니다. –

+0

제 경우에는 마지막 것을 원합니다. 그러나 나는이 행동에 의지 할 수 있다는 것을 알고 싶다.(IoC 컨테이너를 확장하지 않으면 각 이름에 이름을 붙일 수 없다는 것은 사실입니다. 어딘가에 stackoverflow에서 확장 메소드 예제를 보았지만 안타깝게도 검색 할 때 찾지 못했습니다. 여기 어딘가에 있습니다. 그래도 필요하다면.) –

+0

IOC 컨테이너 확장 ... 나쁜 생각은 아닙니다. 마커 인터페이스 만 사용합니다. –

답변

2

나는 마지막 하나를 얻는 것이 보장된다는 것을 말할 것이다. 당신이 the source code 보면 당신은 현재 동작을 볼 수

// internal class ServiceProvider 
ServiceEntry entry; 
if (_table.TryGetEntry(serviceType, out entry)) 
{ 
    return GetResolveCallSite(entry.Last, callSiteChain); 
} 

Microsoft는 미래에이 동작을 변경한다면, 그뿐만 아니라 .NET 핵심 DI 컨테이너의 클라이언트에 영향을 미칠 것이다 심각한 파괴 변화 될 것이다 , 제 3 자 컨테이너에 대한 모든 어댑터의 클라이언트에도 영향을 미칩니다.

.NET Core 컨테이너의 동작에 따라 DI 추상화 계약이 결정되고 어댑터로 전달되기 때문에 어댑터가 작동하지 않을 수도 있습니다.

이 변경 내용이 너무 심하기 때문에이 동작을 결코 변경할 수 없으므로 동작이 보장됩니다.

+0

소스 코드에 링크했을 때 GitHub의 실제 코드 행에 어떻게 링크 되었습니까? –

+2

@Ron 줄 번호를 클릭하여. – CodeCaster

관련 문제