6

MEF を始めたばかりで、解決できない問題に遭遇しました。(MEF 経由で) DLL を読み込む Windows サービスがあり、各 DLL は WCF サービス ホストです。Windows サービスを実行して DLL を読み込むと、WCF DLL の 1 つが「アクティビティ」を取得するたびに再インスタンス化して、入ってくるデータを処理することを除いて、すべて正常に動作します。これは可能ですか?

4

2 に答える 2

4

これは、IServiceBehaviorとを実装し、 inIInstanceProviderの私の実装を登録し、オブジェクトの有効期間を管理することで処理できます。特に、各リクエストでサービス タイプの同じインスタンスを提供するコントロール コンテナーの反転を使用できます (つまり、シングルトンではなく、シングルトンのような動作)。IServiceBehaviorOnStartIInstanceProvider

public partial class MyServiceHost : ServiceBase {
    // details elided

    protected override void OnStart(string[] args) {
            this.Host = new ServiceHost(typeof(MySerivce));
            this.Host.Description.Behaviors.Add(new MyServiceBehavior());
            this.Host.Open();
    }
}

public class MyServiceBehavior : IServiceBehavior {
    public void AddBindingParameters(
        ServiceDescription serviceDescription,
        ServiceHostBase serviceHostBase,
        Collection<ServiceEndpoint> endpoints,
        BindingParameterCollection bindingParameters
    ) { }

    public void ApplyDispatchBehavior(
        ServiceDescription serviceDescription,
        ServiceHostBase serviceHostBase) {
            IIoCContainer container = new IocContainer();
            foreach (var cdBase in serviceHostBase.ChannelDispatchers) {
                ChannelDispatcher cd = cdBase as ChannelDispatcher;
                if (cd != null) {
                    foreach (EndpointDispatcher ed in cd.Endpoints) {
                        ed.DispatchRuntime.InstanceProvider = new MyInstanceProvider(
                            container,
                            serviceDescription.ServiceType
                        );
                    }
                }
            }
        }

    public void Validate(
        ServiceDescription serviceDescription, 
        ServiceHostBase serviceHostBase
    ) { }
}

public class MyInstanceProvider : IInstanceProvider {
    readonly IIocContainer _container;
    readonly Type _serviceType;

    public InstanceProvider(IIoCContainer container, Type serviceType) {
        _container = container;
        _serviceType = serviceType;
    }

    public object GetInstance(InstanceContext instanceContext, Message message) {
        return _container.Resolve(_serviceType);
    }

    public object GetInstance(InstanceContext instanceContext) {
        return GetInstance(instanceContext, null);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance) { }       
}
于 2009-12-15T16:41:08.417 に答える
4

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

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

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

于 2009-12-15T16:41:54.217 に答える