ABP 이론 학습의 사건 버스와 영역 사건

13675 단어 eventbus
ABP 이론 학습의 사건 버스와 영역 사건
전체 디렉토리로 돌아가기

카탈로그

  • 이벤트 버스
  • 정의 이벤트
  • 트리거 이벤트
  • 이벤트 처리
  • 핸들 등록
  • 등록 취소
  • C#에서 우리는 하나의 클래스에서 자신의 이벤트를 정의할 수 있고, 다른 클래스는 이 이벤트를 등록할 수 있으며, 어떤 일이 발생하면 이 클래스에 알릴 수 있다.이것은 데스크톱 응용 프로그램이나 독립된 윈도우즈 서비스에 매우 유용하다.그러나 웹 응용 프로그램에 있어서는 약간의 문제가 있다. 대상은 모두 웹 요청에서 만들어진 것이고 이러한 대상의 생명 주기가 매우 짧기 때문에 특정한 종류의 이벤트를 등록하는 것은 매우 어렵다.그 밖에 다른 종류의 이벤트를 등록하면 클래스가 긴밀하게 결합될 수 있다.
    영역 이벤트는 응용 프로그램의 논리를 결합시키고 반복적으로 이용하는 데 사용됩니다.

    이벤트 버스


    이벤트 버스는 모든 이벤트를 촉발하고 처리하는 다른 종류에 의해 공유되는 단일 대상입니다.이벤트 버스를 사용하려면 먼저 인용을 받아야 합니다.다음과 같은 두 가지 방법이 있습니다.

    기본 인스턴스 만들기


    당신은 직접 EventBus를 사용할 수 있습니다.Default.다음은 글로벌 이벤트 버스입니다.
    EventBus.Default.Trigger(...); // 
    

    IEventBus 주입


    EventBus를 직접 사용하지 않습니다.Default, IEventBus의 인용을 얻기 위해 의존 주입을 사용할 수도 있습니다.이것은 단원 테스트에 유리하다.여기서 우리는 속성 주입 모드를 사용한다.
    public class TaskAppService : ApplicationService
    {
        public IEventBus EventBus { get; set; }
            
        public TaskAppService()
        {
            EventBus = NullEventBus.Instance;
        }
    }
    

    주입 이벤트 버스에 대해 속성 주입은 구조 함수 주입보다 적합하다.이렇게 하면 너의 종류는 사건 라인을 벗어나도 일을 할 수 있다.NullEventBus는 null 객체 모드를 구현합니다.네가 위의 구조 함수를 호출했을 때, 실제로는 아무것도 하지 않았다.

    정의 이벤트


    이벤트를 트리거하기 전에 이벤트를 정의해야 합니다.이벤트는 EventData에서 파생된 클래스를 사용하여 표시됩니다.작업task가 완료될 때 이벤트를 트리거하고 싶다고 가정하십시오.
    public class TaskCompletedEventData : EventData
    {
        public int TaskId { get; set; }
    }
    

    이 클래스는 클래스 처리 이벤트에 필요한 속성을 포함합니다.이벤트 데이터 클래스는 이벤트 소스와 이벤트 타임 속성을 정의합니다.

    미리 정의된 이벤트


    ABP는 AbpHandle Exception Data를 정의합니다. 모든 이상을 자동으로 처리할 때 이 이벤트를 터치합니다.이상에 대한 정보를 더 얻고 싶다면 (심지어 ABP는 모든 이상을 자동으로 기록할 수도 있다) 특히 유용하다.이 사건을 등록한 후 이상이 발생하면 통지해 드리겠습니다.
    실체의 변경에도 일반적인 이벤트 데이터 클래스가 있습니다: EntityCreatedEventData, EntityUpdateEventData, EntityDeletedEventData.그것들은 모두 Abp에 정의되어 있다.Event.Bus.Entities 네임스페이스에 있습니다.ABP는 엔티티를 삽입하거나 업데이트하거나 삭제할 때 이러한 이벤트를 자동으로 트리거합니다.예를 들어 만약에 Person 실체가 있다면EntityCreatedEventData에 등록하면 새로 만든Person 실체 대상이 데이터베이스에 삽입될 때 알림을 받을 수 있습니다.이 사건들도 계승을 지원한다.만약 Student 클래스가 Person 클래스에서 파생되고 EntityCreated Event Data에 등록된다면, Person이나 Student가 삽입될 때 알림을 받을 수 있습니다.

    이벤트 트리거


    이벤트를 트리거하는 것은 다음과 같이 간단합니다.
    public class TaskAppService : ApplicationService
    {
        public IEventBus EventBus { get; set; }
            
        public TaskAppService()
        {
            EventBus = NullEventBus.Instance;
        }
    
        public void CompleteTask(CompleteTaskInput input)
        {
            //TODO:  task ...
            EventBus.Trigger(new TaskCompletedEventData {TaskId = 42});
        }
    }
    
    

    다음은 Trigger 메서드의 몇 가지 재로드입니다.
    EventBus.Trigger(new TaskCompletedEventData { TaskId = 42 }); // 
    EventBus.Trigger(this, new TaskCompletedEventData { TaskId = 42 }); //  ' ' 'this'
    EventBus.Trigger(typeof(TaskCompletedEventData), this, new TaskCompletedEventData { TaskId = 42 });// ( )
    

    이벤트 처리


    이벤트를 처리하려면 다음과 같이 IEventHandler 인터페이스를 사용해야 합니다.
    public class ActivityWriter : IEventHandler, ITransientDependency
    {
        public void HandleEvent(TaskCompletedEventData eventData)
        {
            WriteActivity("A task is completed by id = " + eventData.TaskId);
        }
    }
    

    이벤트 버스(Event Bus)는 ABP의 의존 주입 시스템에 통합되었다.위에서 ITransientDependency를 실현한 바와 같이 TaskCompleted 이벤트가 발생하면ActivityWriter 클래스의 새로운 실례를 만들고 Handle Event 방법을 호출해서 마지막에 놓습니다.더 많은 지식은 의존 주입을 보십시오.

    베이스 이벤트 처리


    이벤트 버스는 이벤트의 상속을 지원합니다.예를 들어 Task Event Data와 그 두 개의 하위 클래스를 만들었습니다:Task Completed Event Data와 Task Created Event Data:
    public class TaskEventData : EventData
    {
        public Task Task { get; set; }
    }
    
    public class TaskCreatedEventData : TaskEventData
    {
        public User CreatorUser { get; set; }
    }
    
    public class TaskCompletedEventData : TaskEventData
    {
        public User CompletorUser { get; set; }
    }
    

    그리고 IEventHandler로 이 두 사건을 처리할 수 있습니다.
    public class ActivityWriter : IEventHandler<TaskEventData>, ITransientDependency
    {
        public void HandleEvent(TaskEventData eventData)
        {
            if (eventData is TaskCreatedEventData)
            {
                //...
            }
            else if (eventData is TaskCompletedEventData)
            {
                //...
            }
        }
    }
    
    

    그럼요. 당신이 처리하고 싶은 모든 사건을 IEventHandler로 처리할 수 있습니다.

    다중 이벤트 처리


    하나의 단일 처리 핸들에서 여러 개의 사건을 처리할 수 있다.이때, 당신은 모든 사건을 위해 IEventHandler를 실현해야 합니다.예를 들면 다음과 같습니다.
    public class ActivityWriter : 
        IEventHandler, 
        IEventHandler, 
        ITransientDependency
    {
        public void HandleEvent(TaskCompletedEventData eventData)
        {
            //TODO:  ...
        }
    
        public void HandleEvent(TaskCreatedEventData eventData)
        {
            //TODO:  ...
        }
    }
    

    핸들 등록


    이벤트를 처리하기 위해서, 우리는 이벤트 핸들을 이벤트 버스에 등록해야 한다.

    자동


    ABP는 IEventHandler를 실현한 모든 클래스를 자동으로 스캔하여 이벤트 버스에 등록합니다.하나의 사건이 발생할 때, 이 핸들을 인용할 수 있도록 의존 주입을 사용하고, 사건을 처리한 후에 이 핸들을 방출합니다.ABP의 이벤트 버스를 이렇게 사용하는 것을 권장합니다.

    수동


    이벤트에 수동으로 등록할 수도 있지만 조심해서 사용하세요.웹 응용 프로그램에서 이벤트 등록은 응용 프로그램이 시작될 때 완료되어야 합니다.웹 요청을 할 때 이벤트에 등록하는 것은 좋은 방법이 아니다. 요청이 완료된 후에 등록된 클래스는 여전히 등록되어 있고, 모든 요청에 대해 계속 다시 등록하기 때문이다.이것은 등록된 클래스가 여러 번 호출될 수 있기 때문에 당신의 응용에 문제를 일으킬 수 있습니다.그리고 수동 등록은 의존 주입 시스템을 사용하지 않는다는 것을 명심해야 한다.
    여기에는 몇몇 사건 버스의 방법의 재부팅이 있다.가장 간단한 의뢰가 기다리고 있습니다. (또는 lambda)
    EventBus.Register(eventData =>
        {
            WriteActivity("A task is completed by id = " + eventData.TaskId);
        });
    

    이렇게 하면'한task 완성'이벤트가 발생할 때 이 lambda 방법이 호출됩니다.두 번째는 IEventHandler가 구현될 객체를 기다리고 있습니다.
    EventBus.Register(new ActivityWriter());
    

    이벤트는 ActivityWriter의 동일한 인스턴스를 호출합니다.이 방법에도 비범형 무거운 짐이 있다.다른 리셋은 두 개의 일반 매개 변수를 받아들인다.
    EventBus.Register();
    

    이벤트 버스는 각 이벤트에 대해 새 Activity Writer를 생성합니다.만약 그것이 방출할 수 있다면, ActivityWriter를 호출할 것입니다.Dispose 방법.
    마지막으로, 핸들 생성을 처리하기 위해서, 이벤트 핸들 공장을 등록할 수 있습니다.핸들 공장에는 두 가지 방법이 있는데 그것이 바로 GetHandler와ReleaseHandler이다.예를 들면 다음과 같습니다.
    public class ActivityWriterFactory : IEventHandlerFactory
    {
        public IEventHandler GetHandler()
        {
            return new ActivityWriter();
        }
    
        public void ReleaseHandler(IEventHandler handler)
        {
            //TODO: ActivityWriter  (handler)
        }
    }
    

    주입 시스템에 의존하여 핸들을 만들거나 놓을 수 있는 특수한 공장 클래스 IocHandlerFactory도 있습니다.ABP는 자동 등록 모드에서 이 종류를 사용했다.따라서 의존 주입 시스템을 사용하고 싶으면 자동 등록을 직접 사용하세요.

    등록 취소


    이벤트 버스에 수동으로 등록할 때, 나중에 이 이벤트의 등록을 취소하려고 할 수도 있습니다.이벤트의 등록을 취소하는 가장 간단한 방법은 이 등록 방법의 반환 값을 방출하는 것이다.다음과 같습니다.
    // ...
    var registration = EventBus.Register(eventData => WriteActivity("A task is completed by id = " + eventData.TaskId) );
    
    // 
    registration.Dispose();
    

    당연하지, 등록을 취소하는 것은 어딘가와 어느 시간에 있을 거야.등록 객체를 보존하고 등록을 취소하려는 경우 해제합니다.모든 등록 방법의 재부팅은 이 이벤트의 등록을 취소하기 위해 방출 가능한 대상을 되돌려줍니다.
    이벤트 버스도 Unregister 방법을 제공합니다.예제 사용법:
    // 
    var handler = new ActivityWriter();
                
    // 
    EventBus.Register(handler);
    
    // 
    EventBus.Unregister(handler);
    

    그것 또한 위탁과 공장을 취소할 수 있는 재부팅을 제공하는데, 취소 핸들 대상은 반드시 이전에 등록된 동일한 대상이어야 한다.
    마지막으로 이벤트 버스는 하나의 이벤트의 모든 핸들을 로그아웃하는 UnregisterAll 방법을 제공합니다. RegisterAll () 방법은 모든 이벤트의 핸들을 로그아웃합니다.
    좋은 글은 반드시 써야 한다
    만약에 이 글이 괜찮다고 생각하거나 얻은 것이 있다면 오른쪽의'타상'기능을 통해 저에게 커피 한 잔[물질적 지원]을 주실 수도 있고 오른쪽 아래에 있는 [좋은 글은 정수리] 버튼[정신적 지원]을 눌러주실 수도 있습니다. 왜냐하면 이 두 가지 지원은 제가 계속 글을 쓰고 공유하는 가장 큰 동력이기 때문입니다!
    저자: tkb - 간략
    출처:http://farb.cnblogs.com/
    성명: 오리지널 블로그는 전재할 때 원문 링크를 보류하거나 글의 첫머리에 본인의 블로그 주소를 추가하십시오. 만약에 오류가 발견되면 비판과 시정을 환영합니다.무릇 본인의 문장에 전재하는 경우, 감상 기능을 설정할 수 없으며, 특별한 수요가 있으면 본인에게
    연락!
    http://www.cnblogs.com/farb/p/ABPEventBus.html

    좋은 웹페이지 즐겨찾기