2017-06-22 128 views
0

互动我对托管WCF服务和其他业务课程自之间的互动相当简单的设计问题。服务器端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容器的时候我也有兴趣在响应中。

在此先感谢!

+0

答案取决于'DrawerRequestManager'类实例的生存期限制。有时它必须是单身,有时你可以创建任意数量的实例 - 取决于你如何与硬件通信。如果你给出更多的细节限制,那么可以提供一些东西。 –

+0

'DrawerRequestManager'是一个注册的IOC单身人士,在这里访问硬件是无关紧要的,因为它将由'DrawerRequestManager'引用的其他子层来处理。 – Bruno

回答

0

WCF使用参数的构造函数来创建服务对象,但有一个办法改变。你需要实现你自己的实例提供者。

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

另外,您可以通过使用自定义属性为您服务注入实例提供。

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

+0

好的,我会试试看,但是它如何与PerCall InstanceContextMode配置为例?我猜如果工厂被配置为返回一个由IOC框架定义的单例,那么InstanceContextMode将被忽略,对吗? – Bruno

+0

是的。 InstanceContextMode定义WCF何时创建实例。如果它被配置为Singleton,那么它只会调用您的自定义工厂一次。如果是PerCall,那么它会为每个传入连接调用工厂,但是由您决定返回相同的实例还是不同的实例。 –