일반 명령 처리기를위한 간단한 인젝터 사용

아 라빈 드

Simpleinjector 위키의 지침에 따라 설정된 인터페이스, 명령 및 명령 처리기.

public interface ICommand
{
    string Name { get; set; }
}

public class Command1 : ICommand
{
    public string Name { get; set; }
}

public class Command2 : ICommand
{
    public string Name { get; set; }
}

public interface ICommandHandler<TCommand>
{
    void Execute(TCommand Command);
}

public class Command1Handler : ICommandHandler<Command1>
{
    public void Execute(Command1 Command) {
        Console.WriteLine(Command.Name);
    }
}

public class Command2Handler : ICommandHandler<Command2>
{
    public void Execute(Command2 Command) {
        Console.WriteLine(Command.Name + "Hello");
    }
}

데코레이터 :

public class CommandDecorator<TCommand> : ICommandHandler<TCommand>
{
    private readonly ICommandHandler<TCommand> _handler;

    public CommandDecorator(ICommandHandler<TCommand> handler)
    {
        this._handler = handler;
    }

    public void Execute(TCommand command)
    {
        this._handler.Execute(command);
    }
}

샘플 프로그램

public class Program
{
    static void Main(string[] args)
    {
        Container container = new Container();

        //registering 
        container.RegisterAll<ICommand>(typeof(Command1), typeof(Command2));

        container.RegisterManyForOpenGeneric(
            typeof(ICommandHandler<>),
            typeof(ICommandHandler<>).Assembly);

        container.RegisterDecorator(typeof(ICommandHandler<>), 
            typeof(CommandDecorator<>));

        container.Verify();

        // sample test command 
        ICommand testcommand = new Command2();
        testcommand.Name = "command 1";

        var type = typeof(ICommandHandler<>).MakeGenericType(testcommand.GetType());

        dynamic instance = container.GetInstance(type);
        instance.Execute((dynamic)testcommand);
    }
}

이것이 런타임에 명령을 처리하기위한 올바른 핸들러를 얻는 올바른 방법입니까? 이것은 샘플이며 실제 앱에서 명령은 대기열에 게시되고 서비스는 명령을 읽고 처리합니다. 나는 그것을 위해 Decorator를 사용해야한다고 생각하지만 그것을 작동시킬 수 없다. 더 나은 옵션이 있으면 제안하십시오.

스티븐

명령 ( Command1Command2)은 서비스가 아닙니다. 등록해서는 안됩니다. 서비스 (명령 처리기)를 통해 전달하는 런타임 데이터 (메시지)입니다. 따라서 Collection.Register<ICommand>( RegisterAllv2에서) 등록을 제거해야합니다 . 소용이 없습니다. 귀하의 예제에서는 Command2수동으로 새로 작성 하는 것이 옳은 일 이기 때문에 이미 쓸모 가 없습니다.

코드의 마지막 세 줄에서 수행중인 작업은 알 수없는 유형의 명령을 올바른 명령 처리기 등록에 전달하는 것입니다. ICommandHandler<TCommand>컴파일 타임에 알지 못하는 명령 유형을 기반으로 닫힌 유형 을 빌드해야하기 때문에 항상이를 가져 오기 위해 약간의 반영이 필요합니다 . C # dynamic키워드 를 사용하는 대신 .NET 리플렉션 API를 사용할 수도 있지만 내 경험상 dynamic이 특정 경우에는 사용하는 것이 더 좋습니다. 리플렉션 API의 한 가지 중요한 단점은 API가 항상 throw 된 예외 (실패한 경우)를로 래핑 InvocationException하므로 호출 스택을 처리하는 특정 예외를 수행하기가 더 어렵다는 것입니다.

짧게 말하면 다음과 같이 등록해야합니다.

Container container = new Container();

container.Register(
    typeof(ICommandHandler<>),
    typeof(ICommandHandler<>).Assembly);

container.RegisterDecorator(
    typeof(ICommandHandler<>), 
    typeof(CommandDecorator<>));

그리고 이것은 디스 패칭 로직이어야합니다.

var type = typeof(ICommandHandler<>).MakeGenericType(command.GetType());

dynamic handler = container.GetInstance(type);
handler.Execute((dynamic)command);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

간단한 유닉스 명령을 사용하여 파일의 행을 반전합니까?

분류에서Dev

일반적인 bash 명령에 대한 사용자 지정 별칭 작성

분류에서Dev

일반적인 bash 명령에 대한 사용자 지정 별칭 작성

분류에서Dev

Ubuntu 터미널에서 Java 명령을 사용한 일괄 처리

분류에서Dev

단일 명령으로 중간 서버를 통해 터널을 사용하는 SSH 로그인?

분류에서Dev

간단한 '복사 양식 명령

분류에서Dev

터미널 단일 명령 리소스 사용

분류에서Dev

터미널 단일 명령 리소스 사용

분류에서Dev

Linux 터미널 단일 명령 리소스 사용

분류에서Dev

터미널 단일 명령 리소스 사용

분류에서Dev

간단한 인젝터를 사용하여 새보기를 여는 WPF

분류에서Dev

사용자를 단일 명령으로 만 제한 : "su-"

분류에서Dev

다른 명령에 동일한 인수 사용

분류에서Dev

xargs : 여러 명령에서 동일한 인수 사용

분류에서Dev

새 lisp 사용자를위한 "읽기"명령에 대한 간단한 IO 지침

분류에서Dev

명령 프롬프트에서 MSBuild를 사용하여 간단한 C ++ 실행 파일 디버깅

분류에서Dev

QT Creator를 사용하여 Raspberry Pi에서 Wifi를 통해 간단한 터미널 명령 실행

분류에서Dev

하위 디렉터리에서 target_sources () 명령 사용시 단위 테스트 (qtest)를위한 프로젝트 구조

분류에서Dev

적용 방법! (아님) 간단한 터미널 명령의 연산자

분류에서Dev

일괄 찾기 및 바꾸기를위한 터미널 명령

분류에서Dev

DoJo를 사용한 Worklight 단일 단계 어댑터 기반 인증

분류에서Dev

필터를 사용하여 주제를 구독하기위한 aws cli 명령

분류에서Dev

Pandas를 사용하여 메모리의 원격 셸 명령에서 Paramiko가 반환 한 데이터를 처리하는 방법은 무엇입니까?

분류에서Dev

자바 : 필터를 적용한 후 계산하는 간단한 일반적인 방법을 만들기

분류에서Dev

명령 줄 : 파일 이름 바꾸기를위한 일반 명령

분류에서Dev

명령 줄 FreeCAD를 사용하여 간단한 원통 만들기

분류에서Dev

동일한 명령어에서 메모리 포인터 및 데이터로 동일한 레지스터를 사용할 수 있습니까?

분류에서Dev

쓰기를 처리하기 위해 Google App Engine Datastore의 모든 사용자에게 동일한 상위 키를 사용하는 것이 합리적인가요?

분류에서Dev

반복되는 값의 개수로 일부 열 데이터의 고유 값을 인쇄하는 가장 간단한 명령

Related 관련 기사

  1. 1

    간단한 유닉스 명령을 사용하여 파일의 행을 반전합니까?

  2. 2

    일반적인 bash 명령에 대한 사용자 지정 별칭 작성

  3. 3

    일반적인 bash 명령에 대한 사용자 지정 별칭 작성

  4. 4

    Ubuntu 터미널에서 Java 명령을 사용한 일괄 처리

  5. 5

    단일 명령으로 중간 서버를 통해 터널을 사용하는 SSH 로그인?

  6. 6

    간단한 '복사 양식 명령

  7. 7

    터미널 단일 명령 리소스 사용

  8. 8

    터미널 단일 명령 리소스 사용

  9. 9

    Linux 터미널 단일 명령 리소스 사용

  10. 10

    터미널 단일 명령 리소스 사용

  11. 11

    간단한 인젝터를 사용하여 새보기를 여는 WPF

  12. 12

    사용자를 단일 명령으로 만 제한 : "su-"

  13. 13

    다른 명령에 동일한 인수 사용

  14. 14

    xargs : 여러 명령에서 동일한 인수 사용

  15. 15

    새 lisp 사용자를위한 "읽기"명령에 대한 간단한 IO 지침

  16. 16

    명령 프롬프트에서 MSBuild를 사용하여 간단한 C ++ 실행 파일 디버깅

  17. 17

    QT Creator를 사용하여 Raspberry Pi에서 Wifi를 통해 간단한 터미널 명령 실행

  18. 18

    하위 디렉터리에서 target_sources () 명령 사용시 단위 테스트 (qtest)를위한 프로젝트 구조

  19. 19

    적용 방법! (아님) 간단한 터미널 명령의 연산자

  20. 20

    일괄 찾기 및 바꾸기를위한 터미널 명령

  21. 21

    DoJo를 사용한 Worklight 단일 단계 어댑터 기반 인증

  22. 22

    필터를 사용하여 주제를 구독하기위한 aws cli 명령

  23. 23

    Pandas를 사용하여 메모리의 원격 셸 명령에서 Paramiko가 반환 한 데이터를 처리하는 방법은 무엇입니까?

  24. 24

    자바 : 필터를 적용한 후 계산하는 간단한 일반적인 방법을 만들기

  25. 25

    명령 줄 : 파일 이름 바꾸기를위한 일반 명령

  26. 26

    명령 줄 FreeCAD를 사용하여 간단한 원통 만들기

  27. 27

    동일한 명령어에서 메모리 포인터 및 데이터로 동일한 레지스터를 사용할 수 있습니까?

  28. 28

    쓰기를 처리하기 위해 Google App Engine Datastore의 모든 사용자에게 동일한 상위 키를 사용하는 것이 합리적인가요?

  29. 29

    반복되는 값의 개수로 일부 열 데이터의 고유 값을 인쇄하는 가장 간단한 명령

뜨겁다태그

보관