Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WCF自托管服务中指定单例服务_Wcf_Self Hosting - Fatal编程技术网

在WCF自托管服务中指定单例服务

在WCF自托管服务中指定单例服务,wcf,self-hosting,Wcf,Self Hosting,我正在编写一个通过WCF公开服务的应用程序。该服务是自托管的(控制台应用程序),需要使用单实例。我试图弄清楚如何在服务配置中指定singleton,而不在服务实现中使用属性。是否可以在没有属性的代码中指定singleton 谢谢, Erick您可以将服务实例传递给ServiceHost,而不是传递类型。在这种情况下,您传递的实例将作为单例使用 编辑: 我以前的解决方案不起作用。向ServiceHost构造函数提供实例仍然需要ServiceBehaviorAttribute使用InstanceCo

我正在编写一个通过WCF公开服务的应用程序。该服务是自托管的(控制台应用程序),需要使用单实例。我试图弄清楚如何在服务配置中指定singleton,而不在服务实现中使用属性。是否可以在没有属性的代码中指定singleton

谢谢, Erick

您可以将服务实例传递给
ServiceHost
,而不是传递类型。在这种情况下,您传递的实例将作为单例使用

编辑:

我以前的解决方案不起作用。向
ServiceHost
构造函数提供实例仍然需要
ServiceBehaviorAttribute
使用
InstanceContextMode.Single
。但这一条应该有效:

var host = new ServiceHost(typeof(Service));
var behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
behavior.InstanceContextMode = InstanceContextMode.Single;
host.Open();
var-host=新服务主机(类型(服务));
var behavior=host.Description.Behaviors.Find();
behavior.InstanceContextMode=InstanceContextMode.Single;
host.Open();

ServiceBehaviorAttribute
即使您没有指定它,也会包含在内,因此您只需要获取它并更改默认值。

如果您想将其移动到
web.config
app.config
,您可以使用自定义的
BehaviorExtensionElement
IServiceBehavior

public class InstanceContextExtensionElement : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get
        {
            return typeof(InstanceContextServiceBehavior);
        }
    }

    protected override object CreateBehavior()
    {
        return new InstanceContextServiceBehavior(ContextMode);
    }

    const object contextMode = null;

    [ConfigurationProperty(nameof(contextMode))]
    public string ContextMode
    {
        get
        {
            return (string)base[nameof(contextMode)];
        }
        set
        {
            base[nameof(contextMode)] = value;
        }
    }
}
IServiceBehavior
实际上会将配置中的值解析到枚举中并进行设置(在@Ladislav的回答之后):

然后,您可以在配置中注册并使用它:

<extensions>
  <behaviorExtensions>
    <add name="instanceContext" type="FULLY QUALFIED NAME TO CLASS"/>
  </behaviorExtensions>
</extensions>
...
  <serviceBehaviors>
    <behavior name="Default">
      <instanceContext contextMode="Single"/>

...

我是WCF新手,我有一个WCF服务,我想通过配置而不是类上的元数据来控制它。请提供解决方案的详细信息。我需要将
InstanceContextMode
强制为
PerCall
,此方法也适用于此。
<extensions>
  <behaviorExtensions>
    <add name="instanceContext" type="FULLY QUALFIED NAME TO CLASS"/>
  </behaviorExtensions>
</extensions>
...
  <serviceBehaviors>
    <behavior name="Default">
      <instanceContext contextMode="Single"/>