0

對象的條件優化配置我有以下代碼使用DI框架(Ninject)

public class MyService : IMyService 
{ 
    private readonoly IUnitOfWork _unitOfWork; 
    public MyService(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

//This code is used by web client 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IMyService>().To<MyService>(); 
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
} 

我有一個Web和Windows服務客戶端都使用「的MyService」級。我想在HTTP請求結束時處理「工作單元」(如果客戶端是web),其中客戶端就像一個Windows服務,我想在每次數據庫調用後處理工作單元。如何實現這一目標?我可以在MyService構造函數中添加一個額外的標誌來標識客戶端,但是當將具體類型映射到接口時,如何修改上述代碼以將硬編碼值傳遞給該參數?

回答

0

您的Windows服務中可能會有某種MyServiceRunner,它會調用您的MyService。這個類是Windows特定的服務,這將是明確控制IUnitOfWork的生命週期的地方。或者你可以寫一個MyService的裝飾器來控制工作單元。

有幾件事要注意。儘管您可以在每個Web請求的基礎上重用IUnitOfWork,但請勿在網絡請求結束時使用Commit工作單元,但在服務(成功執行)後顯式執行此操作。由於您的IUnitOfWork的範圍在Windows服務中有很大不同,因此您可能需要一些顯式代碼或顯式註冊來處理此問題。但是,請確保您的MyService不知道這一點:它不應該在意。

如果您有許多服務要在Windows服務中調用,您可能需要考慮應用命令/處理程序模式來處理業務邏輯。你可以閱讀更多關於它here