0

我正在使用一个普通的 WCF DataService 类来公开一个简单的实体框架模型。该服务包含在发布到 IIS 的简单 Web 应用程序中。没什么花哨的,对吧!

我正在尝试构建 MSDN 以这种方式描述的内容

申请及申请范围
在 MVC 应用程序中创建的部件实例存在于以下两个范围之一中:请求范围或应用程序范围。默认情况下,在 Web 请求期间创建的部件实例位于请求范围内。同一请求中的零件实例是共享的,因此如果多个零件导入给定零件,则所有导入器都会收到对同一实例的引用。每个 Web 请求都有自己的范围,因此在一个请求中创建的部分永远不会用于填充另一个请求中的导入。当一个请求结束时,它的关联范围被销毁,并且为它创建的任何部分都被销毁。实现 IDisposable 对象的部件被释放。这可确保正确关闭敏感资源,例如数据库连接。有时,您可能不想为每个请求创建一个部件实例(例如,当您实现应用程序范围的缓存时)。在这些情况下,您可以通过应用 ApplicationScoped 属性来强制在应用程序范围内创建部件。应用程序范围内的部分始终由应用程序中的所有请求共享。应用范围内的一部分可能仅依赖于应用范围内的其他部分的导入。应用程序范围内的部分必须注意线程安全。

主要问题之一是我不知道在哪里创建 RequestScope 容器。我认为 RequestScope Container 应该在 DataService 类之外构建,对吧?

任何帮助appredicate

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 回答