我已经为我的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中使用静态构造函数的正确方法是什么?
由于
答案 0 :(得分:1)
你希望你的Uow构造函数只执行一次,因此你声明它是静态的。为什么不,但不应该使用访问修饰符(public
关键字)进行编译。静态构造函数不接受访问修饰符(或参数)。你确定你的代码有效吗?
我猜你实际上没有使用无效的访问修饰符。
我不知道如何在不首先触发静态构造函数的情况下使用类型。也许NInject能够做到这一点。在这种情况下,只需回退到更简洁的解决方案:将会话工厂添加到NInject,使用单个生命周期和适当的代码来实例化它(基本上是您当前的Uow构造函数所做的),并设置您的Uow以将其作为依赖项。