【问题标题】:NHibernate + Structuremap + TransactionScopeNHibernate + Structuremap + TransactionScope
【发布时间】:2016-03-14 19:57:45
【问题描述】:

我想知道是否有人可以建议在上述场景中使用的最佳模式,假设

A) StructureMap的使用方式如下:

            cfg.For<ISession>()
                .LifecycleIs(new TransientLifecycle())
                .Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

B) 我希望在 TransactionScope 中包装的单个控制器操作中对各种服务/存储库的所有方法调用,这意味着如果任何操作出错,则不应提交任何操作。

我在某处读到,会话必须在 TransactionScope 块中构建,如果这样才能工作,在我的情况下不是这样,因为会话是通过 Structuremap 注入到每个存储库中的。

【问题讨论】:

    标签: nhibernate transactionscope structuremap3


    【解决方案1】:

    如果您想更好地控制 ISession 的范围,我会在您的控制器中注入一个 ISessionFactory 并将 ISession 留在您的存储库中,或者注入一个工厂/工厂来创建您的存储库实例。这样,在每个控制器操作中,您可以执行以下操作:

    using (var session = sessionFactory.OpenSession())
    {
        // Do controller actions
        IMyRepository myRepository = repositoryFactory<IMyRepository>.Create(session);
    
        var myObject = myRepository.FindSomething();
        ...
    }
    

    【讨论】:

    • 嗨 Cole,我想避免将会话参数传递给服务+存储库级别。此外,不应直接从控制器访问 repos。我真的很想以 DI 的方式找到一种方法。
    • @Rok 我上面描述的一切都使用 DI,所以我不确定你的意思。我的建议是通过创建 ISession 的 IOC 容器预先删除存储库的创建,然后使用工厂模式将其留给控制器来创建存储库。这样,您就可以在控制器操作中创建存储库,并在创建时将 ISession 注入其中(在控制器操作中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多