C# MVC3中的Ninject属性注入
我的代码如下所示。我的问题是会话没有被注入,并且我的会话仍然为空。这里怎么了?我使用的是ninject 2.2C# 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
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应该创建控制器工厂它在
库中是什么样子的。