私は基本的に、多くの場所で見た例を使用していますが、それが適切に機能しているとは確信していません。
だから、私は次のものを持っています:
public class NHibernateHelper
{
private readonly string _connectionString;
private ISessionFactory _sessionFactory;
public ISessionFactory SessionFactory
{
get { return _sessionFactory ?? (_sessionFactory = CreateSessionFactory()); }
}
public NHibernateHelper(string connectionString)
{
_connectionString = connectionString;
}
private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard
.Dialect("NHibernate.Spatial.Dialect.MySQLSpatialDialect,NHibernate.Spatial.MySQL")
.ConnectionString(_connectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<EventListing>())
.ExposeConfiguration(x =>
{
x.SetProperty(NHibernate.Cfg.Environment.CurrentSessionContextClass, ConfigurationManager.AppSettings["current_session_context_class"]);
})
.BuildSessionFactory();
}
}
そして私のNinjectスタートアップでは
private static void RegisterServices(IKernel kernel)
{
NHibernateHelper helper = new NHibernateHelper(WebConfigurationManager.ConnectionStrings["eventlisting"].ConnectionString);
kernel.Bind<ISessionFactory>().ToConstant(helper.SessionFactory).InSingletonScope();
kernel.Bind<ISession>().ToProvider(new SessionProvider()).InRequestScope();
kernel.Bind(typeof(IReadOnlyRepository<>)).To(typeof(ReadOnlyRepository<>)).InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope();
}
私のセッションプロバイダークラスは次のようになります
public class SessionProvider : Provider<ISession>
{
protected override ISession CreateInstance(IContext context)
{
ISession session = DependencyResolver.Current.GetService<ISessionFactory>().OpenSession();
session.FlushMode = FlushMode.Auto;
return session;
}
}
私を混乱させているのは、リクエストスコープで ISession を作成する必要があると述べているにもかかわらず、リクエストごとに CreateInstance メソッドを複数回ヒットし、複数のセッションを生成しているように見えることです。
たとえば、このコンストラクターを持つコントローラーがある場合:
public SomeController(
IRepository<SomeClass> someClassRepository,
IRepository<SomeOtherClass> someOtherClassRepository)
{
_someClassRepository = someClassRepository;
_someOtherRepository = someOtherClassRepository;
}
次に、CreateInstance メソッドが 2 回呼び出されます (リポジトリのコンストラクターを追加して、ISession パラメーターを取得する必要があります)。
public Repository(ISession session)
{
this.Session = session;
}
InRequestScope として持つことは、一度だけ呼び出されることを意味すると思いました。私の誤解ですか、それともどこかでコードが抜けていますか。