2016-08-02 5 views
0

그래서 서비스를위한 아주 간단한 명령 인터페이스를 구현하여 httpcmds가 제어 할 수 있도록 보냈습니다.URL 라우팅을 사용하는 명령 패턴

고생하는 부분은 경로를 기반으로하는 명령을 구현하는 가장 좋은 방법입니다. 나는 명령 패턴에 대해 많은 것을 보았지만, 수정하려고하는 것이있다. 모든 경우에 명령어가있는 사전이 있습니다. 사전을 없애고, 예를 들어 클래스의 모든 정적 메소드를 보는 방법이 있습니까? Im 이것이 반성과 함께 할 수있다라고 확신하지만 나는 그것의 예를 아직 보지 않고있다. 그리고 언제나 나는 명령 패턴과 반사를 찾는다. 대부분의 사람들은 그것을 멀리하고 있다고 말한다.

내 주요 목표는 누군가가 사전에 추가하는 것을 잊지 않는 명령을 추가하면 모든 정적 메소드가 경로에 응답하기를 원한다는 것을 확인하는 것입니다.

이것은 좋은 생각입니까, 아니면 정상적인 패턴을 고수해야합니까?

나는에 대한 명령 패턴 보았다이 Multi-threading with .Net HttpListener

과 같은 아주 기본적인 웹 서버와 좋은 예와 http-listener에 무엇 메신저 수행하고자하는 것은이 using the command and factory design patterns for executing queued jobs

되어 사용하여 메신저를 추가해야

전체 솔루션

//simple interface 
interface ICommand 
{ 
    bool Execute(); 
} 

//example cmd 
public class cmd_Restart:ICommand 
{ 
    public bool Execute() 
    { 
     //put your code here 
     //return true or false for success 
     logger.writeLog("It was called!"); 
     return true; 
    } 
} 

class commands 
{ 
    private static Dictionary<string, Type> _commands; 
    public commands() 
    { 
     loadCommands(); 
    } 

    public ICommand GetCommand(string cmdName) 
    { 
     //should probably be more complex to make sure its found 
     return (ICommand)Activator.CreateInstance(_commands[cmdName]); 
    } 

    private void loadCommands() 
    { 
     _commands = new Dictionary<string, Type>(); 
     var cmdType = typeof(ICommand); 

     _commands = AppDomain.CurrentDomain.GetAssemblies() 
      .First(a => a.GetName().Name == "DomoticzServiceManagerTest") 
      .GetTypes() 
      .Where(t => t.Name.StartsWith("cmd_")) 
      .ToDictionary(c => c.Name.Substring(4).ToLower(), 
          c => c); 
     } 
} 
+0

당신은 Asp.net 101로 시작해야합니다. 나는 그 부분을 다룰 것이라고 확신합니다. – Steve

+0

@steve 잘 ASP.NET 또는 웹 서비스 관련 기술을 사용하지 않습니다. 이것은 당신이 명령을 너무 url rest (ish) 호출을 통해 보낼 수있는 Windows 서비스가 될 것입니다 – jrich523

답변

1

세 번째로 운이 좋은!

Here은 ICommand 인터페이스와 같은 특정 인터페이스를 구현하는 모든 유형을 찾을 수있는 코드입니다.

각 유형을 Dictionary<string, Type> - 유형 이름 vs 유형에 등록하십시오.

요청이 들어 오면 유형을 가져옵니다. 사전에서 다음과 같이하십시오.

var command = (ICommand)Activator.CreateInstance(commandType); 
command.Execute(); 

이제 등록하지 않아도 유형을 찾고 자동 발송합니다.

조금 기본이지만 과거에는 나를 위해 일한 패턴입니다.

+1

그것이 효과가있다! 전체 솔루션으로 질문을 업데이트하는 중입니다. 감사합니다! – jrich523

0

반사는 ASP.NET MVC와 WebAPI에 모두 사용된다. 따라서 클래스의 메서드

public class AccountController: Controller 
{ 
    public ActionResult Login(string username, string password) 
    ... 
} 

컨트롤러 클래스와 동작 메서드는 모두 리플렉션에 의해 발견되어 런타임에 의해 호출됩니다.

명령 사전에 대해 이야기 할 때 Nancy과 같은 라이브러리에 대해 이야기하는 것 같군요?

학습 경험이 아니면 기존 솔루션을 사용하고 싶은 유혹을 느낍니다. 예를 들어, ASP.NET MVC가 이미 원하는 것을 수행하고, 전투 테스트를 거쳤으며, 도움을 받기 쉽다면, 자신의 바퀴를 재발견하는 것은 실수 일 수 있습니다.

+0

이것은 내가 무엇에 대해 이야기하고 있습니다 http://stackoverflow.com/questions/8788366/using-the-command-and-factory -design-patterns-for-queuing-queued-jobs – jrich523

+0

멋지다. 나는 당신에게 더 잘 어울리는 MEF에 기초한 대답을 게시했습니다. –

0

발견 부분을 수행하고 프레임 워크에 내장 된 MEF을보고 싶을 수도 있습니다.

그러면 원하는 것은 발송자의 일종입니다.

포스트 : 같은 경로와 낸시 서비스와 같은 뭔가 [ "/ : 커맨드 이름은"] = _ => {}

그런 다음 명령 이름을 선택하고 해당 컨테이너에 파견.

MEF의 링크에는 명령 이름을 기반으로 명령을 보내는 방법을 보여주는 'ImportMany'라는 단어가있는 섹션이 포함되어 있습니다.

결과로; TopShelf과 Nancy를 사용하여 HTTP에 응답하는 Windows 서비스를 호스팅했습니다.

+0

흠, 전에 MEF를 사용해 왔지만 실제 플러그인 시스템을 더 많이 사용하기 위해이 기본 기능이 아닙니다. 나는이 오버 헤드를 추가하고 싶지는 모르겠지만, 그걸로 놀아 보겠다. – jrich523

관련 문제