2017-11-12 24 views
2

IoC、特にCastle Windsorを初めて使用しています。私はこのようになりますどのeventpublisherのためのコンポーネントを登録しようとしている:Castle Windsor - イベントハンドラーの登録コンポーネント

container.Register(Component.For<IEventPublisher>().ImplementedBy<EventPublisher>()); 

私は上記のコンテナ・レジスタ・コードが正しいことを確信しているが、私は言う、別のエラーメッセージが表示されます。

ことができますコンポーネント 'Network.Infrastructure.Event.EventPublisher'を作成する必要があります.Network.Infrastructure.Event.EventPublisherは次の依存関係を待機しています。 - Service 'System.Collections.Generic.IEnumerable`1 [ [Network.Infrastructure.Event.IEventListener、Network.Infrastructure、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null]] 'が登録されていませんでした。

私はIEventListenerを登録しようとしましたが、運がありません。

ArticleService.cs

public class ArticleService : IArticleService 
{ 
    private readonly IArticleRepository _articleRpRepository; 
    private readonly IUnitOfWork _unitOfWork; 

    **Declaring the field for IEventPublisher** 
    private readonly IEventPublisher _eventPublisher; 


    public ArticleService(IArticleRepository articleRpRepository, IUnitOfWork unitOfWork, IEventPublisher eventListener) 
    { 
     _articleRpRepository = articleRpRepository; 
     _eventPublisher = eventListener; 
     _unitOfWork = unitOfWork; 
    } 

    public Article CreateArticle(Article article) 
    { 
      **Using the publish from eventpublish class** 
      _eventPublisher.Publish(new MyEvent { Message = "Something is done" }); 

      article.Created = DateTime.Now; 
      _articleRpRepository.Add(article); 
      SaveChanges(); 

      return article; 
     } 

    } 

EventPublisher.cs

public class EventPublisher : IEventPublisher 
    { 

    private readonly IEnumerable<IEventListener> _listeners; 

    public EventPublisher(IEnumerable<IEventListener> listeners) 
    { 
     _listeners = listeners; 
    } 

    public void Publish<TPayload>(TPayload payload) where TPayload : class 
    { 
     var handlersForPayload = _listeners.OfType<IEventListener<TPayload(); 
     foreach (var handler in handlersForPayload) 
     { 
      handler.Handle(payload); 
     } 
    } 
} 

あなたはコンテナにし、あなたのリスナーを登録よりCollectionResolverを追加する必要がIEventListener.cs

public interface IEventListener 
{} 

public interface IEventListener<in TPayload> : IEventListener where TPayload : class 
{ 

    void Handle(TPayload payload); 
} 
+0

ウィンザー、それは '解決できないことを言っているIEnumerbable 'それはEventPublisher' 'のインスタンスを作成する必要があること – zaitsman

答えて

関連する問題