私が直面していた問題の良い解決策を見つけました。通常、WCFエンドポイントをホストする場合、これは従うコードです。
ServiceHost serviceHost = new ServiceHost(typeof(IService))
ここでは、ServiceHostインスタンスに公開するインターフェイスのタイプを渡します。このアプローチの代わりに、インスタンス化されたオブジェクトを取り込むServiceHostコンストラクターの2番目のオーバーロードを利用できます。これで、コードは次のようになります
ServiceImplementation implementation1 = new ServiceImplementation();
ServiceHost serviceHost = new ServiceHost(implementation1);
ここで注意すべきことは、実装インスタンスモードを「InstanceContextMode.Single」としてマークする必要があることです。これにより、実質的にSinglretonになります。
これで問題を解決する方法は、実装クラスを使用して、ホストから実装にメタデータを渡すことです。私のコードは次のようになります。
// Create a metadata class just to hold your data.
public class MetaData
{
public MetaData(string data1,int data2)
{
Data1 = data1;
Data2 = data2;
}
public string Data1 { get; set; }
public int Data2 { get; set; }
}
//インスタンスをホストに渡すだけです。
MetaData metaData = new MetaData("D1", 100);
ServiceImplementation implementation1 = new ServiceImplementation(metaData);
ServiceHost serviceHost = new ServiceHost(implementation1);
//私の実装は次のようになります
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
internal class ServiceImplementation : IService
{
private MetaData m_MetaData;
public ServiceImplementation(MetaData metaData)
{
m_MetaData = metaData;
}
public string Ping(string name)
{
return m_MetaData.Data1;
}
}
メンバー'm_MetaData'にすべてのメタデータがあることを確認してください。