2017-08-31 55 views
0

我已经建立了一个WCF服务器和客户端,并且所有工作都很好,我可以在服务器上调用该方法,并从该调用接收初始化的对象...很好。从WCF服务器接收值

我遇到的问题是服务器在启动时接收到一些参数,但我无法看到的是我如何从服务器获取这些值,因为看起来我无法从中获取消息或预初始化的类服务器本身。

有没有办法提供这种信息,而不是将其保存到文件,当服务器第一次收到它,然后从服务器方法读取该文件?

谢谢

回答

1

最简单的方法是有一个单身服务对象。

[ServiceContract] 
public interface IExampleService 
{ 
    [OperationContract] 
    int GetInitValue(); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class ExampleService : IExampleService 
{ 
    private readonly int initValue; 

    public ExampleService(int initValue) 
    { 
     this.initValue = initValue; 
    } 

    public int GetInitValue() => initValue; 
} 

// ... 

// public ServiceHost(object singletonInstance, params Uri[] baseAddresses) 
var host = new ServiceHost(new ExampleService(someValue))); 

host.AddServiceEndpoint(typeof(IExampleService), 
    new WSHttpBinding(), "http://localhost:8080"); 
host.Open(); 

当单模式是不合适的,可以使用依赖注入,例如:这可以通过标记与ServiceBehavior属性的服务类和传递该对象ServiceHost构造进行与团结:

var container = new UnityContainer(); 

container 
    .RegisterType<IExampleService, ExampleService>() 
     // When service object is created, someValue is passed to it's constructor 
     new InjectionConstructor(someValue)); 

var host = new ServiceHost(typeof(ExampleService)); 

host.AddServiceEndpoint(typeof(IExampleService), 
    new WSHttpBinding(), "http://localhost:8080") 
    .EndpointBehaviors.Add(new UnityEndpointBehavior(container)); 

host.Open(); 

// ... 

class UnityEndpointBehavior : IEndpointBehavior 
{ 
    private readonly IUnityContainer container; 

    public UnityEndpointBehavior(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public void AddBindingParameters(ServiceEndpoint endpoint, 
     BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, 
     ClientRuntime clientRuntime) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, 
     EndpointDispatcher endpointDispatcher) 
    { 
     endpointDispatcher.DispatchRuntime.InstanceProvider = 
      new UnityInstanceProvider(container, endpoint.Contract.ContractType); 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
    } 
} 

class UnityInstanceProvider : IInstanceProvider 
{ 
    private readonly IUnityContainer container; 
    private readonly Type contractType; 

    public UnityInstanceProvider(IUnityContainer container, Type contractType) 
    { 
     this.container = container; 
     this.contractType = contractType; 
    } 

    public object GetInstance(InstanceContext instanceContext) 
    { 
     return GetInstance(instanceContext, null); 
    } 

    public object GetInstance(InstanceContext instanceContext, Message message) 
    { 
     return container.Resolve(contractType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    { 
     container.Teardown(instance); 
    } 
} 
+0

第一个选项完美的作品,谢谢:) –