2014-11-13 4 views
0

규칙을 사용하여 ninject 컨테이너를 구성하고 동시에 선택한 모든 서비스의 인스턴스를 만들고 싶습니다. 나의 현재 솔루션입니다 :Ninject : 구성 도중 서비스 인스턴스 생성

 var singletons = new List<Type>(); 
     kernel.Bind(x => 
      x.FromThisAssembly() // Scans currently assembly 
       .SelectAllClasses() 
       .WithAttribute<SingletonAttribute>() 
       .Where(type => 
       { 
        var include = MySpecialFilterOfSomeSort(type); 
        if (include) 
        { 
         singletons.Add(type); 
        } 
        return include; 
       }) // Skip any non-conventional bindings 
       .BindDefaultInterfaces() // Binds the default interface to them 
       .Configure(c => c.InSingletonScope()) // Object lifetime is current request only 
      ); 
      singletons.ForEach(s => kernel.Get(s)); 


내가 내 프로세스 서비스 버스가 있습니다. 일부 구성 요소는 [싱글]로 장식하고 서비스 버스로 자신을 등록합니다

// the constructor 
public FooEventsListenerComponent(IServiceBus serviceBus) { 
    serviceBus.Subscribe<FooEvent>(e => HandleFooEvent(e)); 
} 

나는 모든 서비스 버스 관찰자의 인스턴스를 생성하는 응용 프로그램에 장소가 필요합니다. 유형 매핑이 다음과 같이 편리합니다 (그러나 적절합니까?) 1. 유형이 이미 열거되어 있기 때문에 2. DI 컨테이너에 액세스 할 수 있습니다.

+0

가 왜 그것들을 초기화해야하나요 : 모든 바인딩 그냥 할로 커널 후

가 초기화됩니다? 어쨌든 [Composition Root] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/)의 일부로 인스턴스화해서는 안됩니까? 그렇지 않은 경우 응용 프로그램이 닫힐 때 "종료"하라는 메시지와 같이 일반적인 논리를 공유합니까? 또는 인스턴스화 후 "초기화"하시겠습니까? ... – BatteryBackupUnit

+0

@BatteryBackupUnit, 공정한 질문. 질문을 업데이트했습니다. –

답변

0

나는 당신이 서비스 버스 등록을 명백하게하는 것이 합리적이라고 생각한다고 설명한다. 규칙에 대한 다른 질문에 my answer을 확장하려면

은 청취자를위한 인터페이스 만들기 :

public interface IServiceBusSubscriber 
{ 
    void SubscribeTo(IServiceBus serviceBus); 
} 

는 다음 기본 인터페이스에 IServiceBusSubscriber에서 상속 모든 유형을 결합하기 위해 규칙을 적용 할 수 있습니다 (그들은 FooServiceBusSubscriberBarServiceBusSubscriber과 같은 이름이어야하며 명시 적으로 IServiceBusSubscriber이어야합니다.

IServiceBus serviceBus = kernel.Get<IServiceBus>(); 
foreach(IServiceBusSubscriber subscriber in kernel.GetAll<IServiceBusSubscriber>()) 
{ 
    subscriber.SubscribeTo(serviceBus) 
} 
+0

인터페이스가없는 서비스에 kernel.GetAll을 수행하는 방법이 있지만 속성으로 꾸며져 있습니까? 뭔가 :'kernel.GetAllWithAttribute ()' –

+0

당신은 그렇게 할 수 없습니다. 바인딩 (규칙)에는 속성 만 사용할 수 있지만 검색/인스턴스화에는 사용할 수 없습니다. – BatteryBackupUnit

관련 문제