使用Ninject将ASP.NET MVC应用程序连接到多个NHibernation会话工厂

时间:2011-02-14 22:41:17

标签: asp.net-mvc asp.net-mvc-3 nhibernate ninject

我想知道是否有人可以提供帮助。我正在编写一个需要连接到2个独立数据库的MVC3应用程序。我正在使用NHibernate和Ninject来实现持久性。一切都很好地连接到一个数据库。在我的 Global.asax.cs 文件中,我有:

public class MvcApplication : NinjectHttpApplication
{

    public static ISessionFactory SessionFactory = CreateSessionFactory();


    public MvcApplication()
    {

        this.BeginRequest += new EventHandler(MvcApplication_BeginRequest);
        this.EndRequest += new EventHandler(MvcApplication_EndRequest);
    }

    void MvcApplication_EndRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Unbind(SessionFactory).Dispose();
    }

    void MvcApplication_BeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(SessionFactory.OpenSession());
    }

    private static ISessionFactory CreateSessionFactory()
    {
        var cfg = new Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "nhibernate.config"));
        return cfg.BuildSessionFactory();
    }

    ...

    protected override IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }

    protected override void OnApplicationStarted()
    {
        log4net.Config.XmlConfigurator.Configure();
        HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); 
        base.OnApplicationStarted();
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}

我有一个Ninject课程

public class AdultDirectionsNinjectModule : NinjectModule
{
    public override void Load()
    {
        ...
        this.Bind<ISession>().ToMethod(x => MvcApplication.SessionFactory.GetCurrentSession());
        ...

阅读并成为.NET新手后,我发现很难找到如何将我的应用程序连接到多个数据库。我在网上搜索过,但很多例子都是我头脑中的问题,或者不是我的问题。我意识到我需要多个会话工厂,但后来我不知道如何用Ninject连接它。如果我需要多个会话工厂,Ninject只允许我绑定一个 ISession,这是一个问题。我正在使用NHibernate的xml配置而且不流畅。

有人可以提供一些易于遵循的帮助来启动和运行两个会话工厂。我们将非常感激地提供任何帮助。

1 个答案:

答案 0 :(得分:1)

您使用contextual binding和/或.Named()。幸运的是,relevant docs 尚未更新为Ninject V2语法(但在wiki上观察这个空间......)现在有很多不同机制的例子。