2014-02-06 32 views
1

對不起,我會盡力更好地解釋問題。 我已創建了我的log4net的實例的包裝,我實例化這個記錄器與下面的構造:設計模式:具有設置功能的單身人士

public MyLogger(string _dbName) 
    { 
     dbName = _dbName; 
     logger = LoggerConfigurator.AddNamedLogger(dbName); 
    } 

現在的問題是:這個構造函數是在兩個不同的類實例化,所以一些消息日誌打印兩次。 我只需要在以前的實例不存在的情況下創建一個新的實例,否則返回實例。一種Singleton模式。問題是Singleton模式不接受參數,所以我沒有辦法通過_dbName。我應該如何處理這種最佳做法?

+0

爲什麼不使用Singleton x = Singleton.GetInstance(params object [] parameters);或創建初始化單個參數設置的初始化方法? x.Init(params object []參數); –

+1

甚至更​​好 - 使用IoC容器!在那裏你可以定義,只有一個類型爲''的實例應該用於所有對它有依賴關係的類。看看:http://msdn.microsoft.com/en-us/library/ff648211.aspx – ElGauchooo

回答

3

如果我理解正確,您正在尋找Multiton(Multiton pattern on Wikipedia)。它基本上是每個鍵一個單(這是維基百科的C#示例):

using System.Collections.Generic; 
using System.Collections.Concurrent; 

namespace MyApplication 
{ 
    class FooMultiton 
    { 
     private static readonly ConcurrentDictionary<object, FooMultiton> _instances 
     = new ConcurrentDictionary<object, FooMultiton>(); 

     private FooMultiton() {} 

     public static FooMultiton GetInstance(object key) 
     { 
      _instances.TryAdd(key, new FooMultiton()); // This would of course be new MyLogger(_dbName) 
      return _instances[key]; 
     } 
    } 
} 
+0

我不這麼認爲,但它會很高興知道。 –

+1

示例錯誤,每次調用GetInstance時都會創建FooMultiton的實例!我使用GetOrAdd而不是TryAdd將其固定在wikipedia上。 – Guillaume

+0

@Guillaume它當然更多的想法比實際的實現,並取決於在構造函數中發生了什麼,它可以改變成ConcurrentDictionary <對象,懶惰> – Jeroen

1

,因爲它不建議給單身的「getHandle」方法的參數,我說你需要通過dbName爲一個單獨的靜態屬性,例如

class MyLogger { 

private String dbname = String.Empty; 

public static String DbName { 
    get { return dbname; } 
    set { dbname = value; } 
} 

private static MyLogger mylogger = null; 

public static MyLogger Handle { 
    get { 
     if (logger == null) mylogger = new MyLogger(dbName); 
     return mylogger; 
    } 
} 

private MyLogger(String db) { 
    // your code 
    logger = LoggerConfigurator.AddNamedLogger(db); 
} 
0
class MySingleton 
{ 
    private static MySingleton _instance; 

    private MySingleton() 
    { 
    } 
    private MySingleton(params object[] parameters) 
    { 
     // assign parameters 
    } 
    public static MySingleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       throw new Exception("not created"); 
      } 
      return _instance; 
     } 
    } 

    public static void Create(params object[] parameters) 
    { 
     if (_instance != null) 
     { 
      return; 
     } 

     _instance = new MySingleton(parameters); 
    } 
} 

需求乘法線程一些同步。