【问题标题】:How to extend WCF DataServices and EntityFramework Model using MEF如何使用 MEF 扩展 WCF 数据服务和实体框架模型
【发布时间】:2013-05-03 08:39:35
【问题描述】:

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

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

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

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

任何帮助appredicate

【问题讨论】:

    标签: asp.net-mvc entity-framework entity-framework-5 mef wcf-data-services


    【解决方案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)));
    

    编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多