2012-09-07 60 views
7

我正在嘗試爲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的所有可用實例並強制注入工廠?

回答

2

簡短的回答:第

您正在尋找類似的構造函數注入,其內容固然更優雅。但事實上,這是不可能的,因爲您無法訪問VSTO插件中的c'tor。

但是無論如何,撥打_kernel.Get<IExpenseWorksheetFactory>有什麼不好?畢竟,顯式調用DI容器來解析依賴關係是它的一個正常使用情況,並且代碼隱藏文件完全是這樣做的:連接東西。

你是對的,代碼隱藏不應該包含任何業務邏輯,但另一方面,它肯定應該包含所需的所有代碼連接起來。這是它存在的主要原因。換句話說:

我認爲通常是一種很好的做法,避免在代碼隱藏文件中的代碼。

在每一種情況下都是不正確的(但只對絕大多數情況而言),你不應該在這裏過頭。如果你這樣做,你會發現自己與系統對抗 - 並記住,系統總是獲勝; - )...

+0

同意...主要關注點總是解決業務問題而不是爭取反對系統和框架! –

+0

構造函數注入是不可能的? VSTO的啓動事件處理程序是您配置ninject的位置,然後您可以將DI用於所有服務和存儲庫對象以及表單。 –