C# MVC3中的Ninject属性注入

C# MVC3中的Ninject属性注入,c#,asp.net-mvc-3,fluent-nhibernate,ninject,ninject.web,C#,Asp.net Mvc 3,Fluent Nhibernate,Ninject,Ninject.web,我的代码如下所示。我的问题是会话没有被注入,并且我的会话仍然为空。这里怎么了?我使用的是ninject 2.2 public class SessionNinjectModule : NinjectModule { public override void Load() { this.Bind<ISession>().ToMethod(x => MvcApplication.SessionFactory.GetCurrentSession

我的代码如下所示。我的问题是会话没有被注入,并且我的会话仍然为空。这里怎么了?我使用的是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));
    }}
public类SessionNinjectModule:NinjectModule
{
公共覆盖无效负载()
{
this.Bind().ToMethod(x=>mvcapapplication.SessionFactory.GetCurrentSession());
this.Bind(typeof(IRepository)).To(typeof(NHRepository)).InRequestScope();
}
}
公共类MVC应用程序:NinjectHttpApplication
{
公共静态ISessionFactory SessionFactory=CreateSessionFactory();
公共mvcapapplication()
{
this.BeginRequest+=新事件处理程序(mvcapapplication\u BeginRequest);
this.EndRequest+=新的事件处理程序(mvcapapplication\u EndRequest);
}
void mvcapapplication\u EndRequest(对象发送方,事件参数e)
{
CurrentSessionContext.Unbind(SessionFactory.Dispose();
}
void mvcapapplication_BeginRequest(对象发送方,事件参数e)
{
CurrentSessionContext.Bind(SessionFactory.OpenSession());
}
私有静态ISessionFactory CreateSessionFactory()
{
string connectionString=“数据源=VARTAN-PC\\SQLEXPRESS;初始目录=mdlivenh;集成安全性=SSPI;”;
流畅地返回。Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(ConnectionString)).ExposeConfiguration(c=>c.SetProperty(“当前会话上下文类”、“线程静态”))
.Mappings(m=>
{
//包括标准NHibernate映射文件和Fluent NHibernate映射文件
//m、 HbmMappings.AddFromAssemblyOf();
m、 FluentMappings.AddFromAssemblyOf();
}).BuildSessionFactory();
}
公共静态无效注册表全局过滤器(全局过滤器集合过滤器)
{
filters.Add(新HandleErrorAttribute());
}
公共静态无效注册表项(路由收集路由)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.IgnoreRoute(“{*favicon}”,new{favicon=@”(.*/)?favicon.ico(/.*)”});
routes.MapRoute(
“默认值”,//路由名称
“{controller}/{action}/{id}”,//带参数的URL
新建{controller=“Home”,action=“Index”,id=UrlParameter.Optional}//参数默认值
);
}
受保护的覆盖IKernel CreateKernel()
{
var kernel=新的标准内核();
Load(Assembly.getExecutionGassembly());
返回内核;
}
/// 
///创建controllerfactory(我认为)
/// 
Application Started()上受保护的覆盖无效
{
base.on应用程序启动();
RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
}
公共类NHRepository:IQueryable,IRepository,其中T:class,IBaseEntity
{
非公开会议;
[注入]
公开会议
{
获取{return\u session;}
设置{u session=value;}
}
#地区成员
虚拟公共对象无法获取(对象id)
{
返回TryCatch(()=>session.Get(id));
}}

用法:NHRepository repository=new NHRepository();

看起来不错。如何实例化您的NHRepository?请确保让Ninject为您创建它,否则它将无法设置会话属性

例如:

// Tell Ninject to give us an NHRepository. var repository = ninjectKernel.Get<NHRepository<Foo>>(); //告诉Ninject给我们一个数据库。 var repository=ninjectKernel.Get();
或者,NHRepository本身可以从内核获取其会话,而不是使用[Ninject]属性:

public ISession Session { get { return ninjectKernel.Get<ISession>(); } } 公开会议 { get{return ninjectKernel.get();}
}我找不到ninjectKernel。获取,什么库或如何声明它?ninjectKernel就是您在CreateKernel方法中创建的内核。将该内核存储在某个位置,然后调用。开始吧。我需要创建ServiceLocator吗?我不需要,不。我可能弄错了,但我相信这是MVC 3的新功能。这个问题解决了您的pr吗问题?我注意到您没有对任何响应进行投票,也没有将任何响应标记为答案。您是否设置了控制器工厂?@Daniel您认为可以解决问题的任何示例?@Daniel OnApplicationStarted应该创建控制器工厂它在
库中是什么样子的。