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