我创建了一个简单的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();
}
}
任何帮助都非常感激。
由于
答案 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。