【问题标题】:Create a ninject Dependency with static constructor使用静态构造函数创建 ninject 依赖项
【发布时间】:2017-09-06 19:57:56
【问题描述】:

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

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 工厂为空。

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

谢谢

【问题讨论】:

  • 您无需将工作单元设置为静态。它应该在没有静态关键字的情况下工作
  • 如果我不将其设置为静态,使用我当前的 Ninject 绑定配置,它会导致 Ninject IOC 为每个分辨率创建单独的会话工厂。

标签: c# nhibernate ninject


【解决方案1】:

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

我猜你实际上已经尝试过不使用无效的访问修饰符。

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

【讨论】:

  • 糟糕,我自己在问题中输入了代码,却忘记了静态构造函数中的访问修饰符。我现在要纠正它。我尝试了你的建议,它也按预期工作。我的绑定是“Bind().To().InSingletonScope();”我已将我的静态构造函数更改为公共实例构造函数。谢谢:)
  • @Dinny 对您的问题的答案进行投票/评分是一种文化,您尤其应该接受实际回答您问题的最佳答案,并且对其他答案进行投票也很常见。另见stackoverflow.com/help/accepted-answer
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 2014-01-10
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多