2016-12-28 1 views
1

ASP.NET MVC 애플리케이션에서 Ninject를 사용하는 경우 웹 사이트의 동시 사용자가 커널을 공유합니까? 그것은ASP.NET MVC 및 웹 전반에 적용됩니다.

if (user == "A") 
     kernel.Bind<IFoo>().To<FooForA>(); 
else 
     kernel.Bind<IFoo>().To<FooForB>(); 

충돌이 발생하지 않고 ... 조건 바인딩 그래서 다른 사용자가이 같은 동일한 인터페이스 뭔가 다른 구체적인 구현을 얻을 만들 수 있습니까?

답변

2

은 웹 사이트의 동시 사용자가 공유하는 커널입니까?

일반적인 (권장되는) 설정에는 AppDomain 당 Kernel의 인스턴스가 하나 있습니다. 이는 모든 요청 (모든 사용자)이 동일한 Kernel 인스턴스에 액세스 할 수 있음을 의미합니다. 객체 그래프의 건설을 기반으로하지 않는 것이 좋습니다

은 ... 가능 조건 바인딩 그래서 다른 사용자가이 같은 동일한 인터페이스 뭔가 다른 구체적인 구현을 얻을 만드는 것입니다 런타임 데이터 ( user == "A"은 런타임 데이터 user을 기반으로 한 결정입니다). injecting runtime data into application composents가하는 것과 동일한 단점을 노출 : 그것은, 모호성을 야기 여분의 책임을 조성 루트를 복잡하고 매우 어려운 당신의 DI 구성의 정확성을 검증 할 수

.

런타임 데이터를 구성 객체 그래프의 메소드 호출을 통해 흐를 수 있도록 :

는 대신, 조언을하는 것입니다.

당신은 런타임 데이터에 기초 FooForA 또는 FooForB 중 어떤 착신을 전달 IFoo 프록시를 도입하는 것만으로 우아이를 달성 할 수있다. 예를 들어 :

public sealed class FooSelectorProxy : IFoo 
{ 
    private readonly FooForA afoo; 
    private readonly FooForB bfoo; 
    public FooSelectorProxy(FooForA afoo, FooForB bfoo) { 
     this.afoo = afoo; 
     this.bfoo = bfoo; 
    } 

    public object FooMethod(object args) { 
     return CurrentFoo.FooMethod(args); 
    } 

    private IFoo CurrentFoo { 
     get { return user == "A" ? this.afoo : this.bfoo; } 
    } 
} 

FooSelectorProxy를 사용하여 다음 등록 할 수 있습니다 :이 순간까지 후 객체 그래프의 건설을 까지 if (user == "A") 코드의 실행을 연기

kernel.Bind<IFoo>().To<FooSelectorProxy>(); 

을 그 런타임 데이터를 사용할 수 있습니다.

+0

우수 답변. 도와 주셔서 대단히 감사합니다. –