【问题标题】:Server Side WCF Service : How to reference/interact with other server components服务器端 WCF 服务:如何引用/与其他服务器组件交互
【发布时间】:2017-11-25 08:27:07
【问题描述】:

我有一个关于自托管 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)。 p>

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

提前致谢!

【问题讨论】:

  • 答案取决于DrawerRequestManager 类实例的生命周期的限制。有时它必须是单例的,有时您可以创建任意数量的实例 - 取决于您与硬件的通信方式。如果您提供更多详细信息是什么限制,那么可以提供一些东西。
  • 'DrawerRequestManager' 是一个已注册的 IOC 单例,这里对硬件的访问完全不相关,因为它将由 'DrawerRequestManager' 引用的其他子层处理

标签: wcf self-hosting


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,我会试一试,但是这如何与 PerCall InstanceContextMode 配置交互,例如?我猜如果工厂配置为返回 IOC 框架定义的单例,InstanceContextMode 将被忽略,对吧?
  • 是的。 InstanceContextMode 定义 WCF 何时创建实例。如果它被配置为单例,那么它只会调用你的自定义工厂一次。如果是 PerCall,那么它会为每个传入的连接调用您的工厂,但由您决定返回相同或不同的实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
相关资源
最近更新 更多