私はIoCコンテナ(Unity)を使用しようとしており、それによって私のためにUDP通信を行うライブラリを作成しようとしています。メソッドコールのライフタイムとユニティとのパラメータ注入
基本的に、私は3つのクラス得た:
以下インターフェース
public interface IUdpClient { Task<UdpReceiveResult> ReceiveAsync(); Task<int> SendAsync(byte[] datagram, int bytes); Task<int> SendAsync(byte[] datagram, int bytes, IPEndPoint endPoint); Task<int> SendAsync(byte[] datagram, int bytes, string hostname, int port); }
を実装するなど、いくつかの符号化/復号化を行うクラスコミュニケー、チェックサムチェックを実装するクラスUdpClientAdapterを次のインターフェース
public interface ICommunicator { Task<int> SendAsync(int command, object dataObject = null); Task<int> SendAsync(int command, IEnumerable<byte> data); Task<T> ReceiveAsync<T>(); }
とコミュニケータの
public interface IController { Task Start(); Task Stop(); Task<MachineStatus> ReadMachineStatus(); }
コンストラクタは
public Communicator(IUdpClient udpClient)
{
this.udpclient = udpClient;
}
ある下記(簡略化)インタフェースを実装する第三のクラスのコントローラ」だから、このクラスは、注入インスタンスIOC-コンテナ - UdpClientへの依存関係を作成します。 私の問題はコントローラクラスにあります。私は非同期メソッドを使用しているので、コントローラのメソッドを呼び出すたびに独自のCommunicator(したがってUdpClient)インスタンスが取得されるようにしたいと思います。私はちょうどcontainer.Resolve()を使用していますか?
私の2番目の質問は、Communicatorクラスのパラメータをどのように処理するかです。私の場合は、接続するUdpServer、つまりタイプIpEndPointのフィールドを設定する必要があります。私はちょうどそのフィールドのセッターでICommunicatorインターフェースを拡張するか、何とかコンストラクターに渡すべきですか?
おかげ
私のコミュニケーションはRequest-> Answerの仕方で動作するので、私はそれをステートレスに変更できないと思います。 1つのメッセージが送信される場合、私は答えを期待します。非同期(または別のスレッド)では、それを保証することはできません。したがって、各要求に対して独自のUdpClientが必要です。私は前もってコミュニケータのインスタンスを1つだけ実装しようとしましたが、私の要求に対して正しい答えを受け取ることが保証できないために失敗しました。少なくとも、何らかの共通バッファ/キューを使用しない限り、私は理解していません。 – kain
あなたの提案したアプローチは私を助けません。 「コントローラ」の1つのメソッドのすべての送信/受信アクションが同じコミュニケータによって処理されることを保証する必要があります。 たとえば、 'ReadMachineStatus()'メソッドは、いくつかの送信操作と受信操作で構成されています。私は、対応するメソッドの回答のみを受け取るようにしなければなりません(そして、例えば、 'Stop'などの他のメソッド呼び出しではありません) – kain