2014-02-06 29 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); 
    } 
} 

需求乘法线程一些同步。