0

나는 일반적인 유형 I은 유형이간단한 인젝터 : 생성자의 매개 변수와 함께 열린 제네릭 형식을 등록하면

public class Context<T> : IContext<T> { public Context(string url, string key) { } ... }

(매개 변수로 생성자) 구현

public interface IContext<T> {}

과를 만들었습니다

간단한 인젝터에 등록하고 싶습니다. 내가 생성자 매개 변수에 전달 된 유형이있는 경우 아래의 코드로, 내가 생성자

container.Register(typeof(IContext<>), typeof(Context<>))

This 하나의 값을 전달하는 방법을 잘 모릅니다는 방법을 보여줍니다. 그러나 나를 위해 그것의 기본 유형 만. 내가 이것을 달성 할 수있는 건설 해결 행동을 무시하는 것처럼 보입니다. 그러나, 나는 그것을 어떻게 활용할 것인가에 대한 아이디어를 얻지 못합니다. 누군가 나를 인도하여 적절한 방법을 찾을 수 있습니까?

답변

1

개방형 제네릭 등록에 원시 종속성을 다룰 때 일반적인 해결 방법은 DTO에 구성 값 집합을 추출하여 해당 DTO를 유형의 생성자에 주입하는 것입니다. 나는 생성자 (제네릭 형식을

공용 인터페이스의 IContext {}

, 나는이 유형의 것을 구현을 만든

: 이것은 당신이 컨테이너에 단독으로하는 새 구성 객체를 등록 할 수 있습니다 해당 유형의 생성자를 변경할 수없는 경우

public class ContextConfiguration 
{ 
    public readonly string Url; 
    public readonly string Key; 
    public ContextConfiguration(string url, string key) { ... } 
} 

public class Context<T> : IContext<T> 
{ 
    public Context(ContextConfiguration config) 
    { 
    } 
    ... 
} 

// Configuration 
container.RegisterSingleton(new ContextConfiguration(...)); 
container.Register(typeof(IContext<>), typeof(Context<>)); 

) 매개 변수와 함께, 당신은 당신이 Composition Root 내부에 배치 유형의 하위 클래스를 만들 수 있습니다. 그 Context<T>이 밀봉

// Part of the Composition Root 
private class ContextConfiguration 
{ 
    public readonly string Url; 
    public readonly string Key; 
    public ContextConfiguration(string url, string key) { ... } 
} 

private class CompositionRootContext<T> : Context<T> 
{ 
    public Context(ContextConfiguration config) : base(config.Url, config.Key) 
    { 
    } 
    ... 
} 

// Configuration 
container.RegisterSingleton(new ContextConfiguration(...)); 
container.Register(typeof(IContext<>), typeof(CompositionRootContext<>)); 

경우, parameter injection behavior을 무시할 수 있지만, 일반적으로,이 경우 외부 라이브러리에 의해 정의 된 유형을 다루고 :이 하위 유형은 다시 구성 DTO를 사용합니다. 외부 유형의 경우 일반적으로 애플리케이션 맞춤형 추상화 뒤에 숨기는 것이 더 좋습니다 (DIP에 따라). 응용 프로그램 코드가 IContext<T>에 의존하도록하는 대신 응용 프로그램에서 정의한 인터페이스에 응용 프로그램을 종속시킵니다. Composition Root의 일부로 응용 프로그램 특정 인터페이스를 Context<T>으로 변경하는 Adapter을 구현하십시오. 해당 어댑터의 생성자는이 구성 DTO를 사용할 수 있습니다.

+0

통찰력을 주셔서 감사합니다. 스티븐. 나는 당신이 제안한대로 DTO를 만들 수 있다고 생각합니다. 그러나, 왜 그것을 싱글 톤으로 등록할까요? 런타임 중에 매개 변수를 전달합니까? (내 요구 조건은 런타임 도중 전달하는 것입니다.) –

+0

@AthiS : 아, 그 질문에서 빠진 몇 가지 중요한 정보였습니다. 값은 _runtime _data_입니다. [이 기사] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)를 읽어보십시오. 런타임 데이터를 처리하는 방법을 설명합니다. – Steven

+0

재미있는 스티븐 읽기. 귀하의 입력과 함께 나는 런타임 데이터가 생성자를 통해 전달 못해서 디자인을 변경했습니다 –