2011-03-15 77 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