2017-08-31 56 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

第一個選項完美的作品,謝謝:) –