1
我有一个WCF应用程序托管在IIS上。 我正在初始化一个自定义的ServiceHostFactory中的IoC容器。IIS上的WCF:将数据从ServiceHostFactory传递到服务实例
基本上我希望能够将IoC容器“注入”到在该ServiceHost范围内创建的每个Service实例。
你会怎么做到这一点?
阿里尔
我有一个WCF应用程序托管在IIS上。 我正在初始化一个自定义的ServiceHostFactory中的IoC容器。IIS上的WCF:将数据从ServiceHostFactory传递到服务实例
基本上我希望能够将IoC容器“注入”到在该ServiceHost范围内创建的每个Service实例。
你会怎么做到这一点?
阿里尔
就像你说的,你需要的是应以创建您的服务中使用的定制ServiceHostFactory。事情是这样的:
public class SessionPerCallServiceHostFactory : ServiceHostFactory { public SessionPerCallServiceHostFactory() { } protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { return new SessionPerCallServiceHost(serviceType, baseAddresses); } }
您还需要负责创建必要的服务的ServiceHost:
public class SessionPerCallServiceHost : ServiceHost { public SessionPerCallServiceHost() { } public SessionPerCallServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { } protected override void OnOpening() { Description.Behaviors.Add(new SessionPerCallServiceBehavior()); base.OnOpening(); } }
随着IServiceBehavior接口的自定义实现,这将是能够提供者InstanceProvider用于创建服务实例:
public class SessionPerCallServiceBehavior : IServiceBehavior { 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 SessionPerCallInstanceProvider(serviceDescription.ServiceType); } } } } public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection endpoints, BindingParameterCollection bindingParameters) { } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } }
最后的实例提供,将允许您使用的IoC注入任何你想要的要求Servi大街ce实例:
public class SessionPerCallInstanceProvider : IInstanceProvider { private readonly Type _serviceType; public SessionPerCallInstanceProvider(Type serviceType) { _serviceType = serviceType; } public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message) { //I'm creating it without any tricks but you could use your IoC container here return Activator.CreateInstance(_serviceType); } public object GetInstance(InstanceContext instanceContext) { return GetInstance(instanceContext, null); } public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object instance) { } }
希望它有帮助!
是的。它有助于。谢谢 :) – ArielBH 2010-11-10 13:57:17