2017-06-22 118 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,那麼它會爲每個傳入連接調用工廠,但是由您決定返回相同的實例還是不同的實例。 –