2010-11-20 11 views
0

私はNHibernateを使用していますが、私は、セッションを返すメソッドを持つBootStrapperクラスを持っています。私のリポジトリクラスでは、それをISessionオブジェクトに渡しています。私のコントローラでは、コンストラクタにIRepositoryオブジェクトを渡しています。Ninjectにクラスを登録し、そのクラスをコンストラクタに挿入します

IRepositoryをRepositoryクラスにバインドするのに成功しましたが、Repositoryクラスをバインド/登録する方法がわからないため、コントローラがインスタンス化され、コントローラがバインドされるときにBootStrapperクラスからISessionオブジェクトを受け取りますIRepositoryオブジェクトが作成されたときにそれを受け取る。

マイコード:それはそのコンストラクタのためのISessionオブジェクトを受け取るよう

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

     } 
    } 
} 

がどのように私はMySqlProductsRepositoryにISessionを結合しない、そしてどのように私は私のコントローラはそのコンストラクタでIProductsRepositoryを受けるので、それをバインドしていますか?

答えて

2

あなたはプロバイダにISessionをバインドできます。この場合、BootStrapperクラスを変更してProviderから継承し、CreateInstanceメソッドを実装できます。その後

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

は自分MODULへの結合を追加します:

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

それを行う必要があることをそのようになり

関連する問題