2017-04-11 80 views
0

我为我的Nhibernate数据访问方法创建了工作单元包装。我在UnitOfWork类的静态构造函数中初始化了我的会话工厂,希望只初始化一次。使用静态构造函数创建ninject依赖项

public class UnitOfWork : IUnitOfWork 
{ 
    private static readonly ISessionFactory _sessionFactory; 
    static UnitOfWork() 
    { 
     var oracleConfiguration = OracleDataClientConfiguration.Oracle10.ConnectionString(ConfigurationManager.ConnectionStrings[Constants.CONNECTION_STRING].ConnectionString); 
     _sessionFactory = Fluently.Configure() 
          .Database(oracleConfiguration) 
          .Mappings(m => m.FluentMappings.Add<MyMap>()) 
          .BuildSessionFactory(); 
    } 
} 

我然后绑定Ninject内核中,这依赖的UnitOfWork我的应用程序启动时,然后期望Ninject来解决它在我的数据访问库的构造。 (我正在使用构造函数注入)。

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWork>().To<UnitOfWork>(); 
    }                  
} 

但分辨率后,我可以理解,静态构造函数中的代码对象创建过程中从未执行,结果我的NHibernate的Session的工厂为空。

我确定我在这里错过了一些东西。有人能帮我理解在Ninject中使用静态构造函数的正确方法是什么?

感谢

+0

您不需要将您的工作单元设置为静态。它应该没有静态关键字 – OrcusZ

+0

如果我没有将它设置为静态,使用我当前的Ninject绑定配置,则会导致Ninject IOC为每个分辨率创建单独的会话工厂。 – Dinny

回答

1

你想只执行一次你的UOW构造,因此你声明为静态。为什么不,但不应该使用访问修饰符编译(public关键字)。静态构造函数不接受访问修饰符(或参数)。你确定你的代码是有效的吗?

我想你已经尝试了没有无效的访问修饰符。

我不知道如何在不触发静态构造函数的情况下使用类型。也许NInject能够做到这一点。在这种情况下,只需回退到一个更干净的解决方案:使用单例生命周期和适当的代码来将您的会话工厂添加到NInject(实质上是您当前的Uow构造函数所做的),然后将您的Uow设置为依赖项。

+0

我的不好,我在问题中自己键入了代码,并忘记了我的静态构造函数中的访问修饰符。我现在要纠正它。我尝试了你的建议,并且按预期工作。我的绑定是“绑定()。到().InSingletonScope();”并且我已将静态构造函数更改为Public Instance构造函数。谢谢:) – Dinny

+0

@Dinny这是文化投票/评分答案,你应该特别接受实际回答你的问题的最佳答案,并且对其他答案进行投票也很常见。另请参阅http://stackoverflow.com/help/accepted-answer – BatteryBackupUnit