私はフォローしました:この記事そして、それを WCF サービスに実装しました。IServiceBehavior
カスタムを実装し、その Service Behavior でサービスを装飾することにより、パラメーターなしのコンストラクターを持たない Service のインスタンスを作成できます。
[ServiceBehavior]
public class MyService : IMyService
してただろう
[InstanceProviderBehavior]
public class MyService : IMyService
次に、ApplyDispatchBehavior を次のように実装します。
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) {
foreach (EndpointDispatcher ed in cd.Endpoints) {
if (!ed.IsSystemEndpoint) {
Console.WriteLine("Using InstanceProviderBehaviorAttribute");
ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider(Configuration.Instance.Container);
}
}
}
サービスのインスタンスを提供するには、次のようにします。
public object GetInstance(InstanceContext instanceContext, Message message)
{
AlertQueryService result = Container.Resolve<AlertQueryService>();
return result;
}
Windowsで実行したところ、期待どおりに機能しました。しかし、モノを使用したLinuxでは、例外がスローされます
タイプMyServiceの例外デフォルトコンストラクターが見つかりません
これは、mono が InstanceProviderBehaviorAttribute を無視している可能性があることを示しています。
私が気づいたもう1つのことは、次の行です。
Console.WriteLine("Using InstanceProviderBehaviorAttribute");
サービス ホストを開いたときに Windows で実行されます。サービスホストが開かれているときにLinuxにいる間、それはコンソールに書き込まれません。また、Linux の例外は、サービス ホストを開いたときにスローされませんが、IsInitiating
操作が呼び出されたときにスローされMyService
ます。
[OperationContract(IsInitiating = true)]
void Initialize();
これは、IsInitiating 操作を呼び出したときにのみサービス インスタンスが解決されることを示しています。
なぜこれが Windows で動作し、Linux では mono で動作しないのか、何か考えはありますか? また、初期化の動作が異なるのはなぜですか?
ありがとう