2011-10-01 42 views
1

我有这样的仓库:Ninject得到一个通用型ToMethod

public class Repository<T> : IRepository<T> where T : class 
{ 
    private readonly ISession session; 

    public Repository(ISession session) 
    { 
     this.session = session; 
    } 
} 

我用NHQS我通常这样做是为了得到一个ISession的对象:

SessionFactory.For<T>().OpenSession(); 

如何设置Ninject自动为请求的类型创建会话并绑定它?我试过,但我不知道要放什么东西在对于<>():

kernel.Bind(typeof(IRepository<>)) 
    .To(typeof(Repository<>)) 
    .WithConstructorArgument("session", SessionFactory.For<>().OpenSession()); 

看起来我需要获得泛型类型中使用,并通过它在对于<>()

我该怎么做?

回答

2

您不应该使用WithConstructorArgument;改为为ISession创建一个绑定。

kernel.Bind<ISession>.ToMethod(context => ....).InRequestScope(); 

您可以从context.Request.ParentRequest.Service得到IRepository<>类型。现在可以使用反射来提取实体类型。但是,如果您对所有实体使用相同的数据库,那么为所有存储库返回一般会话可能更容易。