WCF:在我的app.config / web.config中使用我的“自定义”ServiceHost来获取我的wcf服务?

时间:2009-10-08 15:03:51

标签: c# wcf wcf-binding

我创建了一个简单的Custom 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();
    }


}

任何帮助都非常感激。

由于

3 个答案:

答案 0 :(得分:2)

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,以便它可以解析。

答案 1 :(得分:0)

如果您自己托管服务(而不是使用IIS或WAS),则只需创建UnityServiceHost而不是常规ServiceHost。

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

答案 2 :(得分:0)

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