2

有时我会在我的网络应用程序中收到此错误堆栈跟踪:

   [ArgumentException: An item with the same key has already been added.]
   System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +52
   System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +10695474
   System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +10
   NHibernate.Util.ThreadSafeDictionary`2.Add(TKey key, TValue value) +93
   NHibernate.Type.TypeFactory.GetType(NullableType defaultUnqualifiedType, Int32 length, GetNullableTypeWithLength ctorDelegate) +88
   NHibernate.Type.TypeFactory.<RegisterDefaultNetTypes>b__c(Int32 l) +82
   NHibernate.Type.TypeFactory.BuiltInType(String typeName, Int32 length) +46
   NHibernate.Mapping.SimpleValue.GetHeuristicType() +168
   NHibernate.Mapping.SimpleValue.get_Type() +49
   NHibernate.Mapping.SimpleValue.IsValid(IMapping mapping) +30
   NHibernate.Mapping.PersistentClass.Validate(IMapping mapping) +87
   NHibernate.Mapping.RootClass.Validate(IMapping mapping) +21
   NHibernate.Cfg.Configuration.ValidateEntities() +183
   NHibernate.Cfg.Configuration.Validate() +13
   NHibernate.Cfg.Configuration.BuildSessionFactory() +36
   Framework.Data.Code.BaseSessionFactoryProvider..ctor() +74
   Framework.Data.Code.SessionFactoryProvider..ctor() +29
   Framework.Data.Code.NestedSessionManager..cctor() +43

我的 SessionFactoryProvider 是线程安全的单调:

 public interface ISessionFactoryProvider
 {
        ISessionFactory GetSessionFactory();
 }
 public abstract class BaseSessionFactoryProvider : ISessionFactoryProvider
 {
        protected readonly ISessionFactory factory;
        public ISessionFactory GetSessionFactory()
        {
            return factory;
        }

        protected BaseSessionFactoryProvider()
        {
            factory = GetConfig().BuildSessionFactory();
        }
        public abstract Configuration GetConfig();
 }
 public class SessionFactoryProvider : BaseSessionFactoryProvider
 {
            public static ISessionFactory SessionFactory
            {
                get { return Instance.factory; }
            }
            public override Configuration GetConfig()
            {
                return new Configuration().Configure();
            }
            public static SessionFactoryProvider Instance
            {
                get
                {
                    return NestedSessionManager.sessionManager;
                }
            }
            class NestedSessionManager
            {
                internal static readonly SessionFactoryProvider sessionManager =
                    new SessionFactoryProvider();
            }
   }

同样在我的应用程序中,我通过 ninject 将 SessionFactoryProvider 绑定到 ISessionFactoryProvider kernel.Bind<ISessionFactoryProvider>().To<SessionFactoryProvider>().InSingletonScope();

所以我的问题是为什么我会收到这个错误?

4

1 回答 1

0

在我的评论中,我说我在你的 Singleton 实现中没有发现任何缺陷。事实上,有一个明显的:你的SessionFactoryProvider无参数构造函数不是私有的,因为SessionFactoryProvider它的构造函数没有任何重载。

所以编译器生成了一个公共的无参数构造函数,SessionFactoryProvider 看看我们是否应该总是在类中包含一个默认构造函数?

所以任何代码都可以SessionFactoryProvider通过这个公共构造函数(这应该很容易测试)实例化一个 new,Ninject 使用它来实例化类。(这是让我感到困惑的一点:Ninject 是如何实例化类的?它不应该能够在没有公共构造函数的情况下实例化一个类)。我想这就是你最终得到 duplicate 的方式SessionFactoryProvider

您应该SessionFactoryProvider使用公共构造函数来实现您的,而无需考虑单例实现。然后只依赖 Ninject 及其InSingletonScope()提供单例功能

于 2013-08-21T11:58:21.900 回答