2012-08-16 6 views
1

데스크탑 응용 프로그램과 웹 응용 프로그램에서 모두 사용할 라이브러리가 있습니다.Ninject 참조되지 않은 구성 요소의 바인딩 범위를 지정하십시오.

이 라이브러리에는 데스크톱에서 싱글 톤으로 바인딩되어야하며 웹에서 요청 범위에 있어야하는 외부 데이터 액세스 구성 요소에 대한 참조가 있습니다.

  • 데스크탑 프로젝트 참조 핵심 프로젝트
  • 웹 프로젝트 참조
  • 핵심 프로젝트 참조 내가 웹 클라이언트에서이 작업을 수행하도록 강요하고있어

오늘 ExternalComponent 핵심 프로젝트 :

Bind<ExternalComponent.IDataAccessComponent>() 
    .To<ExternalComponent.DataAccessComponent() 
    .InRequestScope() 
    .WithConstructorArgument(...); 

데스크톱 클라이언트에서 동일하지만 내 InSingletonScope()이 내 w를 강제합니다. eb 및 데스크톱 애플 리케이션 내 의도가 아닌 ExternalComponent.dll을 참조하십시오.

클라이언트가이 데이터 액세스 구성 요소를 참조하지 않고도이 외부 구성 요소를 사용해야하는 범위를 클라이언트 (웹 또는 데스크톱)에서 지정할 수 있도록 바인딩을 어떻게 만들 수 있습니까?

클라이언트가 필요로하는 범위를받는 핵심 프로젝트의 일부 메소드를 생각해 보았지만 Ninject API에서 찾을 수없는 것을 찾았습니다. 이 필요한 이유

+0

왜 그 참조가 문제입니까? 결국 핵심 프로젝트에 필요하기 때문에 ExternalComponent 어셈블리가 두 응용 프로그램의 기본 경로에 있는지 확인해야합니다. –

+0

불필요한 참조를 피하고 싶습니다. ExternalComponent는 Core에서만 사용되며 ninject 바인딩 구성을 제외하고는 클라이언트에서 참조 할 수있는 유스 케이스가 없습니다. –

+0

전체 바인딩 구문은 일반적인 것입니다. 제네릭 형식 T는 Bind 메서드로 정의됩니다. bind 메소드를 사용하는 System.Type을 사용하거나 객체 바인딩을 사용하는 경우에만 원하는 것을 얻을 수 있습니다. 답으로 모범을 버리 겠어. –

답변

1

는 잘 모르겠어요하지만 System.Type을 받아 구문을 사용하는 경우에만 가능하다 :

public class CoreModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Extend(this.Bind(typeof(IDataAccessComponent)).To(typeof(DataAccessComponent))).WithConstructorArgument("foo", "bar"); 
    } 

    protected virtual IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax) 
    { 
     return bindingWhenInNamedWithOrOnSyntax; 
    } 
} 

public class WebClientModule : CoreModule 
{ 
    protected override IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax) 
    { 
     return bindingWhenInNamedWithOrOnSyntax.InRequestScope(); 
    } 
} 

public class ClientModule : CoreModule 
{ 
    protected override IBindingNamedWithOrOnSyntax<object> Extend(IBindingInSyntax<object> bindingWhenInNamedWithOrOnSyntax) 
    { 
     return bindingWhenInNamedWithOrOnSyntax.InSingletonScope(); 
    } 
} 

위는 강한 바인딩 의미를 제거합니다.