2014-02-25 80 views
0

有沒有更好的方式來創建一個依賴注入自我實例(而不是單身),比這?NInject自我實例

public partial class MainForm : Form, IMessageLogger 
{ 
    public MainForm(IKernel kernel) : this() 
    { 
     this.kernel = kernel; 
     MainForm form = this; 
     kernel.Bind<IMessageLogger>().ToMethod((a) => { return form; }); 
     (...) 

只爲背景:自實例是一個Windows窗體,我要聽某些記錄程序的事件,一些控制器創建的,爲了正確地呈現它們在一個文本框或狀態欄。

綁定到.Self()有一個短暫的範圍,並將爲每個.Get()一個新的對象,使用.ToProvider()只是佳能殺一隻螞蟻,所以給我留下了.ToMethod()但我覺得彆扭在其中創建form溫度值爲了退貨。

+1

這有什麼錯kernel.Bind ()ToMethod((A)=> {返回此;}); ? – Alex

+0

@Alex,甚至沒有嘗試過,因爲我認爲'this'是'that'(匿名代表上下文對我來說是誤導性的,因爲我傾向於認爲這是內核或其他內容)。所以你對我的信息被接受。請添加一個答案,並原諒我愚蠢的問題! Thx – saamorim

+0

我剛剛拍攝了一張:) – Alex

回答

0

最短答案的答案:)歷史

kernel.Bind<IMessageLogger>().ToMethod((a) => { return this; }); 
1

除非這是一個非常簡單的項目,否則我認爲你的表單不應該實施IMessageLogger。從邏輯上說,日誌和窗口是兩個完全不同的東西。這裏有一個選項我會推薦:

  1. 創建一個新類,實現IMessageLogger
  2. 將事件添加到IMessageLogger當記錄新消息時引發。
  3. 用IoC容器註冊IMessageLogger這個新的具體實現。
  4. 在您的表單中,請求從容器中執行IMessageLogger,並訂閱該事件。
  5. 當表單看到事件時,將消息放入ListBox或其他東西。
  6. 這可能是一個好主意,取消訂閱某個地方的活動,比如表單關閉時。

如果您使用IoC容器創建表單,則可能很容易在IMessageLogger類型的構造函數中添加新參數。

現在,任何東西可以顯示您的日誌消息。日誌記錄工具現在與表單分離,使得日後的維護更容易,等等。消息也可以在主窗口打開之前記錄,這可能是有用的。

+0

如果我想進一步解耦,你是對的。我會有生產者/消費者,所以+1給你的答案。但預期的答案是針對所呈現的情況,並且非常簡單。 Thx到@Alex。 – saamorim