使用静态构造函数

时间:2017-04-11 12:21:28

标签: c# nhibernate ninject

我已经为我的Nhibernate数据访问方法创建了一个工作包装单元。我在UnitOfWork类的静态构造函数中初始化我的Session Factory,希望它只初始化一次。

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();
    }
}

然后我在应用程序启动期间将此unitOfWork依赖项与Ninject Kernel绑定,然后期望Ninject在我的数据访问存储库的构造函数中解析它。 (我正在使用构造函数注入)。

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

但是在解决之后,我可以理解静态构造函数中的代码在对象创建期间从未执行过,因此我的Nhibernate Session工厂为null。

我绝对相信我在这里遗漏了一些东西。有人可以帮助我理解在Ninject中使用静态构造函数的正确方法是什么?

由于

1 个答案:

答案 0 :(得分:1)

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

我猜你实际上没有使用无效的访问修饰符。

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