1

我的代码如下所示。我的问题是会话未注入,我的会话仍然为空。这里有什么问题?我正在使用ninject 2.2

    public class SessionNinjectModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<ISession>().ToMethod(x => MvcApplication.SessionFactory.GetCurrentSession());
        this.Bind(typeof(IRepository<>)).To(typeof(NHRepository<>)).InRequestScope(); 

    }
}

    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()
    {
        string connectionString = "Data Source=VARTAN-PC\\SQLEXPRESS;Initial Catalog=mdlivenh;Integrated Security=SSPI;";
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)).ExposeConfiguration(c => c.SetProperty("current_session_context_class", "thread_static"))
            .Mappings(m =>
            {
                // Include both standard NHibernate mapping files and Fluent NHibernate mapping files
                //m.HbmMappings.AddFromAssemblyOf<User>();
                m.FluentMappings.AddFromAssemblyOf<NHMDLive.Models.Mappings.StudyMap>();
            }).BuildSessionFactory();

    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

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

    /// <summary>
    /// Creates the controllerfactory (I think)
    /// </summary>
    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
    public class NHRepository<T> : IQueryable<T>, IRepository<T> where T : class, IBaseEntity
{
    private ISession _session;

    [Inject]
    public ISession session
    {
        get { return _session; }
        set { _session = value; }
    }

    #region IRepository Members

    virtual public T Get(object id)
    {
        return TryCatch(() => session.Get<T>(id));
    }}

用法:NHRepository 存储库 = new NHRepository();

4

1 回答 1

2

看起来不错。你是如何实例化你的 NHRepository 的?请务必让 Ninject 为您创建它,否则它将没有机会设置会话属性。

例子:

// 告诉 Ninject 给我们一个 NHRepository。
var repository = ninjectKernel.Get<NHRepository<Foo>>();

或者,NHRepository 本身可以从内核中获取它的会话,而不是使用 [Ninject] 属性:

公共 ISession 会话
{
    获取 { 返回 ninjectKernel.Get<ISession>(); }
}
于 2011-03-15T22:16:40.647 回答