要求としてファイルを取り込み、ファイルを処理し、応答を非同期的にクライアントに返す WCF サービスがあります。サービスによって生成される応答のタイプと数を別のクライアントに制御させる機能を追加したいと考えています。
たとえば、私のサービスは、良い応答、悪い応答、およびエラー応答を返す可能性があります。UI クライアントで各応答タイプのオン/オフを切り替え、返される良い/悪い応答の数を変更できるようにしたいと考えています。
これは私の現在のサービスです:
[ServiceContract(
SessionMode = SessionMode.Required,
CallbackContract = typeof(IEmulatorServiceCallback))]
public interface IEmulatorService
{
[OperationContract]
void Submit(TransferredFile file);
[OperationContract]
bool Subscribe();
[OperationContract]
bool Unsubscribe();
}
[ServiceContract]
public interface IEmulatorServiceCallback
{
[OperationContract(IsOneWay = true)]
void OnResponseReady(TransferredFile file);
}
クライアント側には、次のものがあります。
public interface IResponseListener : IEmulatorServiceCallback
{
event EventHandler<MessageEventArgs> OnMessageReceived;
bool Connect();
void Disconnect();
}
[CallbackBehavior(
ConcurrencyMode = ConcurrencyMode.Single,
UseSynchronizationContext = false)]
[Export(typeof(IResponseListener))] // MEF
public class CallbackListener : IResponseListener
{
// Sets up and creates the service to be used.
public CallbackListener()
{
DuplexChannelFactory<IEmulatorService> pipeFactory =
new DuplexChannelFactory<IEmulatorService>(
new InstanceContext(this),
new NetTcpBinding(),
new EndpointAddress("net.tcp://localhost:8000/EmulatorService"));
_service = pipeFactory.CreateChannel();
}
// Connects & Subscribes as service callback
public bool Connect() { /* Code removed */ }
// Removed as service callback
public void Disconnect() { /* Code removed */ }
// Implementation of interface that raises event to be captured by client
public void OnResponseReady(TransferredFile file) { /* Code removed */ }
[Export]
IEmulatorService _service;
// Event raised when the OnResponseReady method is called
public event EventHandler<MessageEventArgs> OnMessageReceived;
}
public interface IServiceProxy
{
void SendMessage(string path);
}
[Export(typeof(IServiceProxy))]
public class EmulatorServiceProxy : IServiceProxy
{
public void SendMessage(string path)
{
var file = new TransferredFile(
File.ReadAllBytes(path),
Path.GetFileName(path));
EmulatorService.Submit(file);
}
[Import]
public IEmulatorService EmulatorService { get; set; }
}
完全な実装に深く入り込む必要はありませんが、MEF から IResponseListener と IServiceProxy を取得し、それらを ViewModel のコンストラクターに渡してそこで使用するクライアント用のブートストラップがあります。そのため、WPF アプリにバインドされている ViewModel は、実際には IServiceProxy と IResponseListener を使用してモデルを更新します。
上記のサービス コントラクトを使用するクライアントは、設定 (応答の種類/数) を制御するクライアントと同じではない可能性が高いと思います。ユーザーの要求に応じて設定を行う 1 つのクライアントと、要求を送信して非同期応答を受信する別のクライアント (別のアプリケーションの一部) があると思います。
だから、私はこれにアプローチする方法がわかりません。私が検討している方法がいくつかあります: 1) クライアントが設定を変更できるようにする完全に別のサービスを用意し、何らかの方法でサービスに設定コントラクトを共有させる。2) このサービスが実装する 2 つ目のインターフェイス (設定用) を追加すると、設定コントラクトもサービス内に含まれます。
最初のアプローチは、これらの設定を共有するのは難しいと思います。ただし、MEF を使用しているため、これにより簡単になる可能性があります。
2 番目のアプローチについては、それも機能しますか? 同じサービス クラスで 2 つのサービス コントラクトを実装できますか? その場合、サービスを個別にホストする必要がありますか?
他のオプションは、すべての設定メソッドを同じサービスに含めることだと思いますが、設定を気にしないクライアントが接続するときに、接続する必要がないように、可能であればそれらを分離したかったのです。それらの方法について心配してください。
誰かが似たようなことをしなければなりませんでしたか?どのようなアプローチをお勧めしますか?
ありがとう
-g