Инъекция свойства Ninject в MVC3 - PullRequest
1 голос
/ 16 марта 2011

Мой код, как показано ниже.Моя проблема в том, что сеанс не введен, и мой сеанс остается нулевым.Что здесь не так?Я использую 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 ();

1 Ответ

2 голосов
/ 16 марта 2011

выглядит хорошо. Как вы создаете экземпляр своего 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>(); }
}
...