StructureMap是否具有与NInject的DefinesNamedScope / InNamedScope相对应的范围?

时间:2011-03-03 09:57:19

标签: nhibernate dependency-injection ninject structuremap

我想解决的问题是在IXyzRepositories之间共享一个ISessionProvider(其中ISessionProvider持有当前的NHibernate ISession)。

我正在调整NHibernate 3 Cookbook中的“按演示者设置会话”方法,并希望保留StructureMap(布朗菲尔德项目)。

2 个答案:

答案 0 :(得分:1)

我认为你必须创建一个自定义的Lifecyle来做到这一点,虽然我不确定你到底想要完成什么......

要创建自定义生命周期,您只需实施ILifecycle接口并在注册中使用它。以下是您可以查看的示例:http://blog.mikeobrien.net/2010/01/creating-structuremap-lifecycle-for-wcf.html

答案 1 :(得分:1)

在Web应用程序中,我使用Singleton作为sessionFactory,使用HybridHttpOrThreadLocalScoped作为会话: 这是我的结构图注册表:

public class NhibernateRegistry: Registry
{
    public NhibernateRegistry()
    {
        For<ISessionFactory>()
        .Singleton()
        .Use(new NHibernateSessionFactory(connectionString).SessionFactory);

        For<ISession>()
        .HybridHttpOrThreadLocalScoped()
        .Use(o => o.GetInstance<ISessionFactory>().CurrentSession);
    }
}

我的NHibernateSessionFactory类似于本书中使用的SessionProvider类。 一切都在请求结束时处理(网络应用程序):

protected void Application_EndRequest(object sender, EventArgs e)
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

我使用通用存储库:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    private readonly ISession _session;

    public GenericRepository(ISession session)
    {
        _session = session;
    }

    public T Load(Guid Code)
    {
        return (_session.Load<T>(Code));
    }

}

但您可以使用自己的实现轻松更改它。 我在这里注册了存储库:

public class RepositoriesRegistry : Registry
{
    public RepositoriesRegistry()
    {
        For <Data.IRepository<Domain.Reminder, Guid>>()
            .HybridHttpOrThreadLocalScoped()
            .Use<Data.NH.Repository<Domain.Reminder, Guid>>();
    }
}