我正在嘗試爲Excel VSTO項目配置DI。Excel中的依賴注入VSTO和Ninject.Extensions.Factory
爲給定的工作表生成的代碼隱藏提供了一個名爲Startup的事件,它負責爲諸如Startup,Change,BeforeDoubleClick等事件設置事件處理程序。
我認爲通常是一種很好的做法,避免在代碼隱藏文件中的代碼。
我所做的是創建外部類,負責操作工作表並調用外部代碼,如Web服務,數據庫和域邏輯。
我可以成功創建一個工廠,供代碼隱藏文件使用並實例化工作表邏輯類。
例如:
//...inside Sheet1.cs
private IExpenseWorksheetFactory _factory;
void ExpensesBeforeRightClick(Excel.Range target, ref bool cancel)
{
Application.EnableEvents = false;
var popup = _factory.CreateContextMenu();
popup.ShowContextMenu(target, ref cancel);
Application.EnableEvents = true;
}
// ... rest of Sheet1.cs
上面的代碼是內部代碼隱藏文件,Visual Studio生成和它的最小的。顯示彈出窗口的責任被委託給一個獨特的對象。工廠對象負責與Ninject對話併爲我獲取對象。因爲我通過這樣的接口,該代理是自動生成的使用Ninject.Extensions.Factory項目:
/// <summary>
/// Abstract Factory for creating Worksheet logic objects. Meant to be used with Ninject Factory extension.
/// </summary>
public interface IExpenseWorksheetFactory
{
ExpenseWorksheet CreateWorksheet();
ExpenseWorksheet.ContextMenus CreateContextMenu();
ExpenseWorksheet.Events CreateEventHandlers();
}
在應用程序啓動時,我已經定義了綁定和工廠本身的結合:
//instantiate the kernel in app's Composition Root
_kernel = new StandardKernel();
//worksheet related stuff - seems to be ok to be singleton
_kernel.Bind<ExpenseWorksheet>().ToSelf().InSingletonScope();
_kernel.Bind<ExpenseWorksheet.Events>().ToSelf().InSingletonScope();
_kernel.Bind<ExpenseWorksheet.ContextMenus>().ToSelf().InSingletonScope();
//"automagic" factories
_kernel.Bind<IExpenseWorksheetFactory>().ToFactory();
問題是:
如何注入此工廠生成的VSTO工作表代碼?我不喜歡在工作表的啓動方法中調用_kernel.Get<IExpenseWorksheetFactory>
的想法。是否有可能查找Sheet1的所有可用實例並強制注入工廠?
同意...主要關注點總是解決業務問題而不是爭取反對系統和框架! –
構造函數注入是不可能的? VSTO的啓動事件處理程序是您配置ninject的位置,然後您可以將DI用於所有服務和存儲庫對象以及表單。 –