我想解決的問題是在IXyzRepositories(ISessionProvider持有當前的NHibernate ISession)之間共享一個ISessionProvider。StructureMap是否具有與NInject的DefinesNamedScope/InNamedScope相對應的範圍界定?
我正在調整NHibernate 3 Cookbook的「爲每個演示者設置會話」配方,並希望保留StructureMap(brownfield項目)。
我想解決的問題是在IXyzRepositories(ISessionProvider持有當前的NHibernate ISession)之間共享一個ISessionProvider。StructureMap是否具有與NInject的DefinesNamedScope/InNamedScope相對應的範圍界定?
我正在調整NHibernate 3 Cookbook的「爲每個演示者設置會話」配方,並希望保留StructureMap(brownfield項目)。
我認爲你需要創建一個自定義的生命週期要做到這一點,雖然我不知道你要完成什麼...
要創建一個定製的生命週期,你只需要執行ILifecycle界面並將其用於註冊。以下是您可以查看的示例:http://blog.mikeobrien.net/2010/01/creating-structuremap-lifecycle-for-wcf.html。
在我用辛格爾頓爲SessionFactory和HybridHttpOrThreadLocalScoped會話的Web應用程序: 這是我structuremap註冊表:
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類。 一切都被設置在請求(Web應用程序)結束:
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>>();
}
}