服务器端WCF服务:如何引用/与其他服务器组件交互

时间:2017-06-22 07:32:43

标签: wcf self-hosting

关于自托管WCF服务与其他业务类之间的交互,我有一个相当简单的设计问题。

以下是WCF服务合同:

/// <summary>
/// Represent requests on hardware components made by a client to the controler service
/// </summary>
[ServiceContract(CallbackContract = typeof(IHardwareServiceCallback))]
public interface IHardwareService
{
    [OperationContract(IsOneWay = true)]
    void OpenLeftDrawer();

    [OperationContract(IsOneWay = true)]
    void OpenRightDrawer();
}

服务实施

public class HardwareService : IHardwareService
{
    public void OpenLeftDrawer()
    {

    }

    public void OpenRightDrawer()
    {

    }

}

一个目的是处理有关服务器上客户端调用的业务逻辑的类

class DrawerRequestManager
{
    // Server side Business logic to handle OpenDrawer requests from client
}

主机方案

 Uri adrbase = new Uri(srvConfig.Address);
 var host = new ServiceHost(typeof(HardwareService), adrbase);
 host.AddServiceEndpoint(typeof(IHardwareService), srvConfig.Binding, srvConfig.Address);
 host.Open();

由于这是管理服务实例生命周期的主机,因此正确的方法处理服务实例和业务逻辑类之间的链接(例如DrawerRequestManager)。

我使用的是IOC容器,但我也对不使用IOC容器时的响应感兴趣。

提前致谢!

1 个答案:

答案 0 :(得分:0)

WCF使用无参数构造函数来创建服务对象,但有一种方法可以改变它。您需要实现自己的实例提供程序。

您可以通过ServiceHostFactory注入您的实例提供商:see here

或者,您可以使用服务的自定义属性注入实例提供程序:see here

无论哪种方式,您都可以完全控制如何创建服务实例。您可以在那里使用IOC或只是调用构造函数手动传递您想要的任何参数(例如,引用DrawerRequestManager实例)。