使用: ASP.NET MVC3 Ninject 2 流利的nHibernate
我有2个数据库(DB1和DB2)。我有一个基本存储库类(存储库)和许多控制器(Controller1,Controller2)。
public MyController(IRepository<SomeModelFromDB1> someModelFromDB1Repository, IRepository<SomeModelFromDB2> someModelFromDB2Repository)
{
[...]
}
public class Repository<T> : IRepository<T> where T : Entity
{
private readonly ISession _session;
public Repository(ISessionFactory sessionFactory)
{
_session = sessionFactory.OpenSession();
}
}
public class DB1SessionFactory : ISessionFactory
{
private readonly NHibernate.ISessionFactory _sessionFactory;
private ISession _session;
public DB1SessionFactory()
{
[...]
}
}
public class DB2SessionFactory : ISessionFactory
{
private readonly NHibernate.ISessionFactory _sessionFactory;
private ISession _session;
public DB2SessionFactory()
{
[...]
}
}
现在我创建了MyController。我想要注入我的存储库,但该存储库应该使用DB1(或DB2,具体取决于模型)SessionFactory。
我无法想象如何正确地将它全部注入...当我只有一个SessionFactory(DB1)时,我在这里使用NINJECT:
kernel.Bind<ISessionFactory>().To<DB1SessionFactory>()
.InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
编辑:
最好的是根据模型将正确的会话注入到存储库中。由于某些模型来自DB1,而其他模型来自DB2,因此选择应该依赖于它。如果控制器/视图开发人员不必担心任何事情(比如在存储库前面有[Named]),那将会很棒,但是如果它需要的话。即使使用[Named],我也无法想象如何根据控制器中的[Named]存储库在存储库中注入正确的会话...
答案 0 :(得分:3)
首先,您应该在单例范围内定义sessionfactory,并将会话置于请求范围内。
执行如下配置:
.Bind<ISessionFactory>().To<DB1SessionFactory>().Named("DB1")
.InSingletonScope();
.Bind<ISessionFactory>().To<DB2SessionFactory>().Named("DB2")
.InSingletonScope();
private bool IsOnDB(IRequest request, string dbName)
{
var repositoryType = request.ParentRequest.Service;
var modelType = repositoryType.GetGenericArguments()[0];
var databaseName = this.GetDatabaseForModel(modelType);
return databaseName == dbName;
}
.Bind<ISession>()
.ToMethod(ctx => ctx.Kernel.Get<ISessionProvider>("DB1").OpenSession())
.When(r => this.IsOnDb(r, "DB1"))
.InRequestScope();
.Bind<ISession>()
.ToMethod(ctx => ctx.Kernel.Get<ISessionProvider>("DB2").OpenSession())
.When(r => this.IsOnDb(r, "DB2"))
.InRequestScope();