2016-03-02 82 views
1

我想知道如果有人可以建议在上述方案中使用的最好的模式,假设NHibernate的+ Structuremap +的TransactionScope

A)StructureMap被以下列方式使用:

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

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

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

回答

0

如果您想要更多地控制ISession的范围,我会在您的控制器中注入一个ISessionFactory,并将ISession注入您的存储库或注入一个工厂/工厂来创建您的存储库实例。这样在每个控制器的行动,你可以做这样的事情:

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

    var myObject = myRepository.FindSomething(); 
    ... 
} 
+0

嗨科尔,我想避免将会话参数传递到服务+存储库级别。此外,回购不应直接从控制器访问。我真的很想找到一种以DI方式进行操作的方法。 – Rok

+0

@Rok我上面描述的一切都使用DI,所以我不确定你的意思。我所建议的是通过创建ISessions的IOC容器提前创建存储库,并使用工厂模式将其留给控制器来创建存储库。通过这种方式,您可以在控制器操作中创建存储库,并在创建ISession时将其注入(在控制器操作中)。 –