3

流暢に構成された MEF を使用して、カスタム コンストラクターで WCF サービスをブーストしようとしています。

MEF コンテナが「serviceType」を提供しているかどうかを確認するにはどうすればよいですか。例えば:

   public class MyServiceHostFactory : ServiceHostFactory
    {
        private readonly CompositionContainer container;
        public MyServiceHostFactory()
        {
            this.container = MyCompositionRoot.Instance.Container;

        }
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            if (serviceType == ????)
            {
                return new MyServiceHost(container, serviceType, baseAddresses);
            }
            return base.CreateServiceHost(serviceType, baseAddresses);
        }

    }

次に、インスタンス プロバイダーをビヘイビアーに追加する必要があります。

public MyServiceHost(CompositionContainer container, Type serviceType,
                           params Uri[] baseAddresses) : base(serviceType, baseAddresses)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }
        var contracts = this.ImplementedContracts.Values;
        foreach (var c in contracts)
        {
            // Should I get the service obj here?
            var serviceObj = container.GetExports(serviceType, null, null).First().Value;

            var instanceProvider = new MyInstanceProvider(serviceObj); // ????
            c.Behaviors.Add(instanceProvider);
        }
    }

しかし、このインスタンス プロバイダーがどのように見えるべきかわかりません (serviceTypeパラメーターとして を受け取るべきか、またはserviceObj?

public partial class MyInstanceProvider : IInstanceProvider,  IContractBehavior

本 (.NET での DI インジェクション) の例では、強く結合されたインスタンス プロバイダー、つまり を使用していますMyServiceType1InstanceProviderMyServiceType2InstanceProvider、多くのサービスが流暢な mef に接続されている場合は面倒です。

4

2 に答える 2

1

これを行う 1 つの方法は、 のGetExportsメソッドを使用することですCompositionContainer。を返しますIEnumerable<Lazy<Object, Object>>。少なくとも 1 つの要素が含まれている場合、「serviceType」を使用できます。

したがって、チェックは次のようになります。

if (container.GetExports(serviceType, null, null).Any())
{
     return new MyServiceHost(container, serviceType, baseAddresses);
}

次に、エクスポートされたサービスを取得する方法は次のとおりです。

Object seviceObj = container.GetExports(serviceType, null, null).First().Value;

ここでの問題は、値が System.Object 型であるため、動的にキャストするか、キーワードを使用する必要があるdynamic(そして、コンパイラの優れたヘルプがすべて失われる) ことです。

于 2013-06-28T13:21:55.430 に答える
0

WCF サービスのデフォルトは、呼び出しインスタンスごとのモードです。これは、受信メソッド呼び出しごとに、WCF サービスの新しいインスタンスがインスタンス化されることを意味します。あなたが求めているのはシングルトン インスタンス モードのように思えますが、スケーラビリティが問題になる場合は、これを避けたいと考えています。

これを回避する方法は、呼び出しごとのインスタンス モードを使用することですが、バックグラウンドでアクセスを同期する静的データ ストアを用意します。これにより、接続が確立された後、データ ストアが使用されている間にクライアントが一時的にブロックする必要がある場合でも、少なくともクライアントは接続できます。

詳細については、 System.ServiceModel.InstanceContextModeに関するMSDN ヘルプを参照してください。

于 2013-07-10T08:18:02.180 に答える