0

シンプルなエンティティ フレームワーク モデルを公開するバニラ WCF DataService クラスを使用しています。このサービスは、IIS に発行された単純な Web アプリケーションに含まれています。空想は何もありませんよね!

MSDNがこのように説明しているものを構築しようとしています

請求と適用範囲
MVC アプリで作成されたパーツのインスタンスは、リクエスト スコープまたはアプリケーション スコープの 2 つのスコープのいずれかに存在します。デフォルトでは、Web リクエスト中に作成されるパーツ インスタンスはリクエスト スコープ内にあります。同じリクエストにあるパーツのインスタンスは共有されるため、複数のパーツが特定のパーツをインポートすると、すべてのインポーターが同じインスタンスへの参照を受け取ります。各 Web リクエストには独自のスコープがあるため、あるリクエストで作成されたパーツが別のリクエストでインポートを埋めるために使用されることはありません。リクエストが終了すると、関連するスコープが破棄され、そのために作成されたすべてのパーツが破棄されます。IDisposable オブジェクトを実装するパーツが破棄されます。これにより、データベース接続などの機密性の高いリソースが適切に閉じられます。場合によっては、リクエストごとにパーツ インスタンスを作成したくない場合があります (たとえば、アプリ全体のキャッシュを実装する場合)。このような場合、ApplicationScoped 属性を適用することで、アプリケーション スコープでパーツを強制的に作成できます。アプリケーション スコープ内のパーツは、アプリ内のすべての要求によって常に共有されます。アプリケーション スコープ内のパーツは、そのインポートについてのみ、アプリケーション スコープ内の他のパーツに依存する場合があります。アプリケーション スコープ内のパーツは、スレッド セーフになるように注意する必要があります。

主な問題の 1 つは、RequestScope コンテナーを作成する場所がわからないことです。RequestScope Container は DataService クラスの外に構築する必要があると思いますよね?

任意のヘルプ appredicated

4

1 に答える 1

1

同様のものが必要な場合に備えて、ここに投稿した実用的なソリューションがあります

public class MefDataServiceHostFactory : DataServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(
            Type serviceType, Uri[] baseAddresses)
        {
            ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
            host.Description.Behaviors.Add(new MefServiceBehavior());
            return host;
        }
    }

    public class MefInstanceProvider : IInstanceProvider
    {
        #region fields

        private readonly Type _serviceType;
        private IDependencyScope _diScope;

        #endregion

        #region ctor

        public MefInstanceProvider(Type serviceType)
        {
            _serviceType = serviceType;
        }

        #endregion

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

MEF や IOC を使用できる重要なセクションがここにあります。

        public object GetInstance(InstanceContext instanceContext, Message message)
        {
           _diScope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope();
            return _diScope.GetService(_serviceType);
        }

        public void ReleaseInstance(InstanceContext instanceContext, object instance)
        {
           if (_diScope != null) _diScope.Dispose();
        }
    }

新しいインスタンスを取得してリクエストを破棄する

    public class MefServiceBehavior : IServiceBehavior
    {
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
            {
                var cd = cdb as ChannelDispatcher;
                if (cd != null)
                {
                    foreach (EndpointDispatcher ed in cd.Endpoints)
                    {
                        ed.DispatchRuntime.InstanceProvider = new MefInstanceProvider(serviceDescription.ServiceType);
                    }
                }
            }
        }

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

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

svc ファイルにカスタム ファクトリを登録します。

<%@ServiceHost Service="DataService"
               Factory="MefDataServiceHostFactory"
               language=c# Debug="true" %>

または、新しいサービス ルートを追加します。

routes.Add(new ServiceRoute(string.Empty, new MefDataServiceHostFactory(), typeof (DataService)));

ハッピーコーディング!

于 2013-05-06T09:58:25.543 に答える