2012-07-21 100 views
1

我已成功實施企業SharePoint解決方案,使用Ninject依賴注入和其他基礎結構(如NLog日誌記錄等使用洋蔥式體系結構)。隨着HTTP模塊作爲組成爲根的注入框架,它正常的Web請求的偉大工程:SharePoint定時器作業中的Ninject依賴項注入

public class SharePointNinjectHttpModule: IHttpModule, IDisposable 
    { 
     private readonly HttpApplication _httpApplication; 

     public void Init(HttpApplication context) 
     { 
      if (context == null) throw new ArgumentException("context"); 

      Ioc.Container = IocContainerFactory.CreateContainer(); 
     } 

     public void Dispose() 
     { 
      if(_httpApplication == null) return; 
      _httpApplication.Dispose(); 
      Ioc.Container.Dispose(); 
     } 
    } 

的CreateContainer方法從一個單獨的類庫加載Ninject模塊和我的IoC容器是抽象。 對於正常的Web應用程序請求,我使用了一個名爲Ioc的注入器的共享靜態類。 UI層有一個MVP模式實現。例如,在aspx頁面中,演示者構造如下:

presenter = Ioc.Container.Get<SPPresenter>(new Ninject.Parameters.ConstructorArgument("view", this)); 

我仍然依賴於參數的Ninject參考。除了映射接口中的很多方法外,是否有任何方法可以抽象出它?我不能只傳入簡單類型的參數嗎?

注入本身效果很好,但是在使用SharePoint定時器作業等外部過程時遇到困難。從這裏重用ioc容器顯然是一個糟糕的主意,因此它需要引導依賴關係本身。另外,它需要從Web應用程序池中加載配置,而不是管理Web應用程序。否則,該作業將只能在應用程序服務器上運行。這種方式可以在任何Web服務器上運行作業,並且您的SharePoint功能只需將配置等部署到Web應用程序中即可。

這裏是我的計時器作業的執行方法,它會打開相關的網頁應用程序的配置,並把它傳遞給日誌服務(n日誌),並讀取它從外部Web配置服務配置。我編寫了一些代碼,用於讀取配置文件中的自定義部分,並初始化NLog日誌記錄基礎結構。

public override void Execute(Guid contentDbId) 
     { 
      try 
      { 
       using (var ioc = IocContainerFactory.CreateContainer()) 
       {      
        // open configuration from web application 
        var configService = ioc.Get<IConfigService>(new ConstructorArgument("webApplicationName", this.WebApplication.Name)); 

        // get logging service and set with web application configuration 
        var logginService = ioc.Get<ILoggingService>(); 
        logginService.SetConfiguration(configService); 

        // reapply bindings 
        ioc.Rebind<IConfigService>().ToConstant(configService); 
        ioc.Rebind<ILoggingService>().ToConstant(logginService); 

        try 
        { 
         logginService.Info("Test Job started."); 

         // use services etc... 
         var productService = ioc.Get<IProductService>(); 
         var products = productService.GetProducts(5); 
         logginService.Info("Got products: " + products.Count() + " Config from web application: " + configService.TestConfigSetting); 

         logginService.Info("Test Job completed."); 
        } 
        catch (Exception exception) 
        { 
         logginService.Error(exception); 
        } 
       } 
      } 
      catch (Exception exception) 
      { 
       EventLog.WriteError(exception, "Exception thrown in Test Job."); 
      } 
     } 

這不會使計時器工作足夠健壯,並且有很多鍋爐板代碼。我的問題是如何改進這種設計?這不是最優雅的,我正在尋找一種方法來抽象計時器作業操作代碼,併爲每個計時器作業注入依賴項。如果您認爲這是一個好方法,我只想聽聽您的意見。或者如果有人遇到過類似的問題?由於

回答

0

我想我已經回答了我自己上面的演示施工規範的問題。在項目中使用依賴注入時,注入本身並不重要,但它改變代碼編寫方式的方式更爲重要。我需要爲我的SharePoint計時器作業操作使用類似的模式,例如命令。我只想讓bootstrapping得到更好的處理。