2010-11-19 8 views
2

Dans mon projet MVC, j'ai installé mon MvcApplication_start():problème avec la compréhension Ninject Reliure/Injection

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 

Et ai lié avec succès un sujet de mon IProductsRepository .Pour à MySqlProductsRepository:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private readonly IKernel _kernel = new StandardKernel(new MyServices()); 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
      return null; 
     return (IController) _kernel.Get(controllerType); 
    } 

    public class MyServices: NinjectModule 
    { 
     public override void Load() 
     { 

      Bind<IProductsRepository>().To<MySqlProductsRepository>(); 
     } 
    } 
} 

Mais j'utilise NHibernate, et j'ai une classe Session Factory séparée qui a une méthode GetSession() qui retourne un ISession.

public static ISessionFactory SessionFactory = CreateSessionFactory(); 

    private static ISessionFactory CreateSessionFactory() 
    { 
     var cfg = new Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "nhibernate.config")); 
     cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName, System.Environment.MachineName); 
     NHibernateProfiler.Initialize(); 
     return cfg.BuildSessionFactory(); 
    } 

    public static ISession GetSession() 
    { 
     return SessionFactory.GetCurrentSession(); 
    } 

Je voulais le mettre en place pour que mon MySqlProductsRepository serait passé et objet ISession par Ninject quand il a été créé:

public class MySqlProductsRepository : IProductsRepository 
{ 
    private readonly ISession _session; 

    public MySqlProductsRepository(ISession session) 
    { 
     _session = session; 
    } 

Et mon contrôleur serait remis une instance IProductsRepository:

public class AdminController : Controller 
{ 
    private readonly IProductsRepository _productsRepository; 

    public AdminController(IProductsRepository productsRepository) 
    { 
     _productsRepository = productsRepository; 
    } 

MON PROBLÈME:

Je ne peux pas à comprendre en m y Container IoC où je lie mon IProductsRepository à mon Repository, comment enregistrer un ISession, comment transmettre un ISession à mon objet MyProductsRepository quand il est créé, et remettre un objet MyProductsRepository à mon Controller?

Répondre

2

J'ai un article de blog que j'ai écrit qui explique comment utiliser l'application Ninject in et ASP.NET MVC. L'application dans le blog utilise les mêmes technologies que vous utilisez: Ninject, NHibernate et MySql. J'utilise également un modèle de référentiel. Il y a beaucoup de parallèles entre ce que vous faites et ces messages.

http://blog.bobcravens.com/2010/07/using-nhibernate-in-asp-net-mvc/

http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/

http://blog.bobcravens.com/2010/09/the-repository-pattern-part-2/

http://blog.bobcravens.com/2010/11/using-ninject-to-manage-critical-resources/

Jetez un coup d'oeil. Si vous avez des questions, n'hésitez pas à me contacter.

+0

+1 trucs fantastiques - Comble une lacune sur le marché - cela mérite de devenir une réponse FAQ à ce genre de question ici! –

+0

Merci Bob, parfait, va commencer à les lire maintenant, devrait être une aide majeure. – pghtech