2011-03-15 110 views
1

我的代码如下所示。我的问题是会议没有注入,我的会议仍然是空的。这里有什么问题?我正在使用ninject 2.2MVin3 Ninject属性注入

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 repository = new NHRepository();

+0

你有一个控制器工厂建立? – 2011-03-15 23:20:58

+0

不,这是问题吗? – 2011-03-15 23:24:21

+0

我敢打赌,这是一个问题。 – 2011-03-15 23:44:43

回答

2

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

例子:

// Tell Ninject to give us an NHRepository. 
var repository = ninjectKernel.Get<NHRepository<Foo>>();

或者,而不是使用[Ninject]属性,该NHRepository本身可以抓住它从内核会话:

public ISession Session 
{ 
    get { return ninjectKernel.Get<ISession>(); } 
}
+1

我找不到一个ninjectKernel.Get,什么库或我如何声明? – 2011-03-15 22:52:18

+0

ninjectKernel就是您在CreateKernel方法中创建的内核。将内核存储在某个地方,然后调用。获取它。 – 2011-03-17 16:13:25

+0

我是否需要创建一个servicelocator – 2011-03-21 04:37:07