我想在Microsoft IIS(IIS托管)上托管我的WCF服务。
为此,我创建了我的服务:
// The service
public class MyService : IMyService {
// Ctors
public MyService() {
// Def ctor: I don't want to call it
}
public MyService(...) : this() {
// Parametric ctor, I want to call it!
}
...
}
// The contract
[ServiceContract]
public interface IMyService {
...
}
我创建了一个svc文件(一种为我的服务提供基地址的好方法):
<@ServiceHost Service="MyService" @>
但是这样做,当托管我的服务(只是在IIS中创建指向我的应用程序所在的文件夹的虚拟目录,通常是项目目录)时,IIS将调用默认构造函数。
如何让IIS调用不同的构造函数?
PS:我知道可以指定HostServiceFactory
。这是我应该在这里使用的吗?它让我回到工厂和主人。对于主机,我无法对主机传递的参数进行操作。但是,我该如何解决这个问题?
注意:我了解许多解决方案基于Inversion of control(IoC)和几个IoC框架,如Unity,Castle Project和Spring.NET。但是我根本不会真正使用它们。 WCF可以单独制作吗?我不能接受WCF不能让程序员通过以适当的方式构建服务来托管服务......
答案 0 :(得分:6)
您必须编写多个自定义类以支持使用参数创建服务:
IInstanceProvider
的自定义类。该类将负责使用非默认构造函数创建服务实例。IServiceBehavior
的自定义类。该类将负责将自定义实例提供程序添加到端点调度程序中。ServiceHost
,它将应用您的行为。ServiceHostFactory
,它将实例化您的自定义服务主机。您将从.svc文件中引用此工厂。这通常与构建依赖注入支持相同。您可以查看示例this article。
答案 1 :(得分:0)
看一下Castle WCF Facility(我在制作中使用这个)或Autofac WCF integration
答案 2 :(得分:0)
如果您只需要在服务中调用特定的构造函数,那么您只需要实现IInstanceProvider
并将IServiceBehavior
附加到您的服务中:
public class ServiceInstanceProvider : IInstanceProvider
{
public object GetInstance(InstanceContext instanceContext)
{
return this.GetInstance(instanceContext, null);
}
public object GetInstance(InstanceContext instanceContext, Message message)
{
return new MyService(...);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{}
}
public class InstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
if (!ed.IsSystemEndpoint)
{
ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider();
}
}
}
}
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{}
}
[InstanceProviderBehavior]
public class MyService : IMyService {
public MyService() { }
public MyService(...) : this() {
...
}
...
}
有关这方面的更多信息: