2009-11-13 27 views
1

在我的程序,有一個地方,當我需要訪問從工廠解決了單,重視它的事件:附加到工廠實例化的單例事件 - 什麼是乾淨的方法?

void MyMethod() 
{ 
    myFactory.Resolve<MySingleton>().DoWork += WorkMethod; 
} 

的問題是的MyMethod可以被執行多次,但我要附加事件只有一次(否則我會得到多個電話)。所以我只想在以前沒有依附的時候重視。 它還有什麼比

myFactory.Resolve<MySingleton>().DoWork -= WorkMethod; 
    myFactory.Resolve<MySingleton>().DoWork += WorkMethod; 

回答

5

nicier什麼一些標誌要記住,如果MyMethod已經呼籲單身?

object myCachedSingleton = null; 

void MyMethod() 
{ 
    var s = myFactory.Resolve<MySingleton>(); 
    if (myCachedSingleton == s) return; 
    myCachedSingleton = s; 
    myCachedSingleton.DoWork += WorkMethod; 
} 
+0

您可以將事件和'hasBeenCalled'邏輯放入私有方法中。我通常這樣做是爲了將它從MyMethod()中移除。如果你有很多事件,它會混淆原始方法。 – TheSean 2009-11-13 18:14:14

+0

我認爲這是一個很好的方法,但我的單身並不是一個「終身」的單身人士。有時它可以重新創建,所以它看起來像我應該使用引用它的標誌而不是。 – 2009-11-13 18:49:36

0

您還可以查看InvocationList以查看是否有任何事件已附加到事件。

編輯使用一個動作,所以你不需要傳入一些魔法字符串。

例子:

public bool IsAttached(Action<string> methodToCheck) 
{ 
    SomeWork completed = DoWork; 
    return completed.GetInvocationList().Any(m => m.Method.Name == methodToCheck.Method.Name); 
} 

用法:

var b = new FooBar(); 
    b.DoWork += b_OnWorkCompleted; 
    b.DoWork += c_OnWorkCompleted; 

    Console.WriteLine(b.IsAttached(c_OnWorkCompleted)); 
    Console.WriteLine(b.IsAttached(b_OnWorkCompleted)); 
    Console.WriteLine(b.IsAttached(FooBar)); 

輸出將true, true, false

1

根據如何結合您希望這些類型的是,你可以連接到事件在靜態構造函數。然後它將只能執行一次(我認爲每個AppDomain)。事情是這樣的:

public class MyConsumer 
{ 
    static MyConsumer() 
    { 
     Factory.Resolve<Singleton>().DoWork += WorkMethod; 
    } 

    private static void WorkMethod(...) { ... } 
} 

的(以上)使用的靜態方法是有點倒胃口,但是根據您的要求,可能是好的。

我只是補充說,這裏的其他答案也很好,但請確保您考慮任何線程問題。

0

我只想把我在投票問題所使用的方法,太 - 如果你不同意,將其否決......

這有什麼錯

var singleton = myFactory.Resolve<MySingleton>(); 
singleton.DoWork -= WorkMethod; 
singleton.DoWork += WorkMethod; 

???

相關問題