【问题标题】:WCF: Using my "custom" ServiceHost in my app.config/web.config for my wcf service?WCF:在我的 app.config/web.config 中为我的 wcf 服务使用我的“自定义”ServiceHost?
【发布时间】:2009-10-08 15:03:50
【问题描述】:

我创建了一个简单的自定义 ServiceHost,它继承自 ServiceHost 并覆盖了 InitializeRuntime 方法。

如何更改我的 app.config / web.config 以使用自定义服务主机,以便执行我覆盖的 InitializeRunTime..

我在配置文件中看到了诸如 behaviorConfiguration 等属性,但没有明显的地方可以强制它使用我的自定义 ServiceHost

我的 ServiceHost 很简单:-

public class UnityServiceHost : ServiceHost
{
    protected override void InitializeRuntime()
    {

        //DO MY UNITY INJECTION HERE 
        //Console.WriteLine("");
        base.InitializeRuntime();
    }


}

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: c# wcf wcf-binding


    【解决方案1】:

    Oran Dennison 描述了如何使用 Spring.NET:http://orand.blogspot.com/2006/10/wcf-service-dependency-injection.html

    总之,您将使用 WCF 的“行为注入”来提供由您的 DI 容器创建的服务实例。

    1) 使用 GetInstance 方法创建自定义 IInstanceProvider 实现,该方法返回您的容器创建的服务对象:

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

    2) 实现自定义 IServiceBehaviour,将您的自定义 IInstanceProvider 添加到每个端点配置。

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

    3) 在您的自定义服务主机中,覆盖 OnOpening 并添加您的自定义服务行为

        protected override void OnOpening()
        {
            this.Description.Behaviors.Add(new CustomServiceBehavior());
            base.OnOpening();
        }
    

    请注意,您可能必须将 UnityContainer 实例传递给 IInstanceProvider 以便它可以进行解析。

    【讨论】:

      【解决方案2】:

      您需要创建一个自定义 ServiceHostFactory 并使用它来创建您的 UnityServiceHost。您指定要在 SVC 文件中使用的 ServiceHostFactory。有关 SVC 语法,请参阅 MSDN docs

      【讨论】:

      • 感谢您的回复,但是 TDD 呢,我想测试 WCF 服务类而不是托管的 SVC...我只注入我将要在 wcf 服务中使用的对象- 我不想注入任何服务等
      【解决方案3】:

      如果您自己托管服务(而不是使用 IIS 或 WAS),您应该简单地创建一个 UnityServiceHost 而不是常规的 ServiceHost。

      如果您使用的是 IIS 或 WAS,write a ServiceHostFactory

      【讨论】:

      • 实际上我将使用 IIS 作为主机容器,但对于 TDD,我希望能够直接在 WCF 服务类上使用 TDD,但当然我在 TDD 调用服务时需要注入对象否则某些方法会失败.. 使用 Global.asax 在 SessionStart 上创建并注入值很容易,但我想要一个通用的解决方案,这样主机是 IIS、TDD 或将注入什么值都无关紧要
      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2010-09-30
      • 2013-03-02
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多