2010-11-20 1 views
0

Ich verwende NHibernate, und ich habe eine BootStrapper-Klasse, die über eine Methode verfügt, die eine ISession zurückgibt. In meiner Repository-Klasse übergebe ich ein ISession-Objekt. In meinem Controller übergebe ich seinen Konstruktor ein IRepository-Objekt.Registrieren von Klasse zu Ninject und Injizieren dieser Klasse in Konstruktor

Es ist mir gelungen, mein IRepository an die Repository-Klasse zu binden, aber ich kann nicht herausfinden, wie ich meine Repository-Klasse binden/registrieren kann, damit sie ein ISession-Objekt von der BootStrapper-Klasse erhält und meinen Controller bindet um ein IRepository-Objekt zu erhalten, wenn es erstellt wird.

Mein Code:

public interface IProductsRepository 
{ 
    IQueryable<Product> Products { get; } 
    void SaveProduct(Product product); 
} 


public class MySqlProductsRepository : IProductsRepository 
{ 
    private readonly ISession _session; 

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

    public IQueryable<Product> Products 
    { 
     get 
     { 
      return _session.CreateCriteria(typeof (Product)).List<Product>().AsQueryable(); 
     } 
    } 


public class BootStrapper 
{ 

    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(); 
    } 
} 


public class AdminController : Controller 
{ 
    private readonly IProductsRepository _productsRepository; 

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

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

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

    public class DaisyBlossomsServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IProductsRepository>().To<MySqlProductsRepository>(); 

     } 
    } 
} 

Wie binde ich ein ISession es MySqlProductsRepository so erhält ein ISession Objekt für den Konstruktor und wie binde ich es so meine Controller einen IProductsRepository in seinem Konstruktor empfängt?

Antwort

2

können Sie ISession an einen Provider binden. In diesem Fall können Sie die BootStrapper-Klasse so ändern, dass sie vom Provider erbt und die CreateInstance-Methode implementiert.

Das so aussehen würde:

public class BootStrapper : Provider<ISession> 
    { 
     ..... 
     protected override ISession CreateInstance(IContext context) 
     { 
      return GetSession(); 
     } 
     .... 
    } 

Danach nur die Bindung an Ihr Modul hinzufügen:

public class DaisyBlossomsServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IProductsRepository>().To<MySqlProductsRepository>(); 
      Bind<ISession>().ToProvider<BootStrapper>(); 
     } 
    } 

Das sollte es tun.

Verwandte Themen