3

나는 webapi 프로젝트에서 작업 중이며 Unity를 IOC 컨테이너로 사용하고 있습니다. 유니티 의존성 분석기에 런타임 값 주입하기

unityContainer.RegisterType<BaseProvider, CaseProvider>(new HierarchicalLifetimeManager()); 
unityContainer.RegisterType<IRulesEngine, RulesEngine>(); 
unityContainer.RegisterType<IQuestionController, QuestionController>(); 
unityContainer.RegisterType<IAPIThing, WebAPIThing>(); 

지금 BaseProvider의 생성자가 케이스 식별자 매개 변수로 int를 받아 들인다 : 나는 다음과 같은 계층 종속성 무언가의 세트가있다. WebAPIThing은 생성자에서 BaseProvider를 사용합니다. 일반적으로 비 웹 시나리오에서 내가 좋아하는 뭔가를 사용하는 경우 ID를 주입하는 것 :

public static IAPIThing GetIAPIThing(int caseId) 
{ 
    return CreateUnityContainer().Resolve<IAPIThing >(new ParameterOverride("caseId", caseId).OnType<CaseProvider>()); 
} 

을하지만 명시 적으로 메소드를 호출 할 때에만 작동합니다. 웹 API 시나리오에서 API 컨트롤을 해결하기 위해 config.DependencyResolver = new UnityDependencyResolver(unityContainer);을 사용하고 있습니다.

나는 여전히 DependencyResolver 실행시에 그 BaseProvider 개체를 확인하는 방법에 영향을해야합니다 생각합니다.

누구나 비슷한 것을해야합니까?

내가 작업 표시 다음 사용하여 시도 1
편집 :

unityContainer.RegisterType<BaseProvider>(
     new HierarchicalLifetimeManager() 
     , new InjectionFactory(x => 
        new CaseProvider(SessionManager.GetCaseID()))); 
+1

여기서 'caseId'는 어디에서 오는 것입니까? 어떻게'caseId'가'GetIAPIThing'의 호출자에 의해 구축 되었습니까? 이 값은 세션, 요청 param, 쿠키에서 오는 값입니까? – Steven

+0

@Steven CaseId가 저장되어 세션에서 제공됩니다. – SecretDeveloper

답변

5

을 당신은 의미 객체 그래프로 런타임 값 (케이스 ID)를 주입하려고를 당신은 객체 그래프의 구성, 구축 및 검증을 복잡하게하고 있습니다. 당신이 무엇을해야

는 자신의 추상화 그 프리미티브 값을 촉진한다. 이것은 처음에 어리석게 들릴지도 모르겠지만 그러한 추상화는 기능을 설명하는 데 훨씬 더 잘할 것입니다. 예를 들어 귀하의 경우에는, 추상화는 아마 ICaseContext을 이름을 지정해야합니다 :

public interface ICaseContext 
{ 
    int CurrentCaseId { get; } 
} 

우리 효과적으로 추상화 뒤에 int을 숨기면 :

  • 매우 명시 적으로이 int의 역할을했다.
  • 응용 프로그램에 필요할 수있는 int 유형의 다른 모든 중복성을 제거했습니다.
  • 는 객체 그래프가 구축 된 후까지이 int의 해결을 지연.

이 응용 프로그램의 핵심 계층에 ICaseContext을 정의 할 수 있으며 모두가이를 신뢰할 수 있습니다. 웹 API 프로젝트에서이 ICaseContext 추상화의 웹 API 특정 구현을 정의 할 수 있습니다.예를 들어 :

public class WebApiCaseContext : ICaseContext 
{ 
    public int CurrentCaseId 
    { 
     get { return (int)HttpContext.Current.Session["CaseId"]; 
    } 
} 
이 구현으로 등록 할 수 있습니다

은 다음과 같습니다

이는 것을 의미하기 때문에 자신의 new CaseProvider(SessionManager.GetCaseID()) 구성이 모든 문제를 해결하지 않습니다 마십시오

unityContainer.RegisterType<ICaseContext, WebApiCaseContext>(); 

UPDATE가 객체 그래프를 검증 할 때 사용할 수있는 세션이어야합니다. 응용 프로그램 시작 및 유닛/통합 테스트의 경우에는 해당되지 않습니다.

+0

감사합니다. 사례 ID를 리팩터링하여 상황에 배치하는 것이 좋은 해결책입니다. – SecretDeveloper