2017-11-04 10 views
0

クライアントからいくつかのコマンドを実行するために使用されるWCFサービスがあります。 私は基底クラスAbstractCommandと具体的なコマンドを定義するいくつかの派生クラスを持っています。wcf - 複数のKnowTypeコマンド - 実行のための適切なパターン

WCF Webサービスには、1つのメソッドvoid Execute(AbstractCommandコマンド)があります。 [KnownType]属性を使用して、具体的なコマンド(AbstractCommandから派生したクラス)を受け入れることができます。コマンドは、リポジトリを介してデータベースに対して実行されます。

簡単にするために、のコマンドは、このようなサービスなもので実行されているとしましょう:

public void Excecute(AbstractCommand command) { 
    // Concrete command 1 
    var theCommand = command as ConcreteCommand1; 
    if (theCommand != null) { 
     var par1 = theCommand.Par1; 
     var par2 = theCommand.Par2; 
     ... 
     _repository.DoSomething(par1, par2...); 
     return; 
    } 
    // Concrete command 2 
    var theCommand = command as ConcreteCommand2; 
     ... 

この場合、分岐は少し怖い見て、私はそれをリファクタリングしたいと思います。私はこのような何かを考えている :サービスで、私は不要になったように

public class ConcreteCommand1 : AbstractCommand { 
    public int Par1 { get; set; } 
    public int Par2 { get; set; } 
    ... 

    public void Execure(IRepository repository) { 
     repository.DoSomething(Par1, Par2...); 

:次のようになりますどのを実行メソッドを実装する必要がありAbstractCommand Sを定義し、ConcreteCommand必要がありますもしそれが厄介であれば、このようにすることができます:

public void Excecute(AbstractCommand command) { 
    command.Execure(_repository); 
} 

これはうまく見えます。このアプローチの唯一の欠点は、今ではConcreteCommand DTO(par1、par2 ...)ではなくクラスがロジックを定義する必要があり(Executeメソッド)、IRepositoryを認識する必要があることです。

誰かがより良いアプローチを提案できますか?

+0

あなたのアプローチは理にかなっており、コマンドパターン(http://www.dofactory.com/net/command-design-pattern)にかなり近いと思います。可能であれば、メソッドではなくコンストラクタでリポジトリを注入してみてください。 –

答えて

0

私は上記の方法でソリューションを実装しました。これは非常に柔軟で拡張性があります。 改善の提案があれば、歓迎してください。

関連する問題