asp.net-mvc – 使用NHibernate和Autofac管理多个数据库
|
当我自己拿出一个解决方案的时候,我以为我会在那里得到这个问题. 在构建了大量应用程序之后,我有最后一分钟的要求来支持读/写一个额外的数据库(总共2个,没有已知的其他数据库).我使用NHibernate构建了应用程序,Autofac提供了DI / IoC组件. FWIW,它驻留在ASP.NET MVC 2应用程序中. 我有一个通用的存储库类,它采用NHibernate会话.从理论上讲,我可以继续将这个通用存储库(IRepository<>)用于第二个数据库,只要传递给它的会话是从适当的SessionFactory生成的,对吧? 好吧,当应用程序启动时,Autofac会做到这一点.关于Session和SessionFactory,我有一个模块说明: builder.Register(c => c.Resolve<ISessionFactory>().OpenSession())
.InstancePerMatchingLifetimeScope(WebLifetime.Request)
.OnActivated(e =>
{
e.Context.Resolve<TransactionManager>().CurrentTransaction = ((ISession)e.Instance).BeginTransaction();
});
builder.Register(c => ConfigureNHibernate())
.SingleInstance();
返回基本SessionFactory的ConfigureNHibernate()如下所示: private ISessionFactory ConfigureNHibernate()
{
Configuration cfg = new Configuration().Configure();
cfg.AddAssembly(typeof(Entity).Assembly);
return cfg.Configure().BuildSessionFactory();
}
目前,这仅限于一个数据库.在任何其他NHib场景中,我可能会将单独的SessionFactories的实例推送到哈希中,并根据需要检索它们.我不想重新设计整个事情,因为我们非常接近主要版本.所以,我猜我至少需要修改上面的方法,以便我可以独立配置两个SessionFactories.我的灰色区域是我将如何指定正确的工厂与特定存储库(或至少对于第二个数据库特定的实体). 在以这种方式使用IoC容器和NHibernate时,任何人都有使用此方案的经验吗? 编辑 private ISessionFactory GetSessionFactory(string sessionFactoryConfigPath)
{
Configuration cfg = null;
var sessionFactory = (ISessionFactory)HttpRuntime.Cache.Get(sessionFactoryConfigPath);
if (sessionFactory == null)
{
if (!File.Exists(sessionFactoryConfigPath))
throw new FileNotFoundException("The nhibernate configuration file at '" + sessionFactoryConfigPath + "' could not be found.");
cfg = new Configuration().Configure(sessionFactoryConfigPath);
sessionFactory = cfg.BuildSessionFactory();
if (sessionFactory == null)
{
throw new Exception("cfg.BuildSessionFactory() returned null.");
}
HttpRuntime.Cache.Add(sessionFactoryConfigPath,sessionFactory,null,DateTime.Now.AddDays(7),TimeSpan.Zero,System.Web.Caching.CacheItemPriority.High,null);
}
return sessionFactory;
}
解决方法我假设您希望不同类型的实体进入每个数据库;如果您想在每个数据库中保留相同类型的实体,请查看AutofacContrib.Multitenant.可以帮助解决这种情况的两个因素是: >命名服务http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices 首先,使用命名服务来引用两个不同的数据库.我将它们称为“db1”和“db2”.与数据库相关的所有组件,一直到会话,都注册了一个名称: builder.Register(c => ConfigureDb1())
.Named<ISessionFactory>("db1")
.SingleInstance();
builder.Register(c => c.ResolveNamed<ISessionFactory>("db1").OpenSession())
.Named<ISession>("db1")
.InstancePerLifetimeScope();
// Same for "db2" and so-on.
现在,假设您有一个类型NHibernateRepository< T>接受一个ISession作为其构造函数参数,并且您可以编写一个函数WhichDatabase(Type entityType),在给定实体类型时返回“db1”或“db2”. 我们使用ResolvedParameter根据实体类型动态选择会话. builder.RegisterGeneric(typeof(NHibernateRepository<>))
.As(typeof(IRepository<>))
.WithParameter(new ResolvedParameter(
(pi,c) => pi.ParameterType == typeof(ISession),(pi,c) => c.ResolveNamed<ISession>(
WhichDatabase(pi.Member.DeclaringType.GetGenericArguments()[0])));
(警告 – 在谷歌浏览器中编译和测试;)) 现在,解析IRepository< MyEntity>将选择适当的会话,并且会话将继续被懒惰地初始化并由Autofac正确处理. 当然,您必须仔细考虑交易管理. 希望这可以解决问题!NB (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何使用AntiXss Library正确清理内容?
- .net – 我应该如何设计一个允许IoC的类库,但不依赖于特定的
- asp.net – 将密码格式从加密更改为哈希
- asp.net-mvc-3 – 如何在ASP.NET MVC 3中更新EF 4实体?
- asp.net-mvc – CORS在使用OWIN认证的web api中不起作用
- ASP.NET Forms Authentication阻止在Login.aspx上加载javas
- 在ASP.NET中创建一个适用于黑莓,Windows Mobile和iPhone的小
- 会员资格,SimpleMembership,ASP.NET身份之间有什么区别?
- asp.net-mvc – ASP.Net MVC:发送JSON到控制器
- 获得一个字符串的汉语拼音码
- asp.net-mvc – 通过伪造上下文测试:实体框架
- asp.net-mvc – ASP.NET MVC的Content / Themes
- asp.net-mvc – 如何通过MVC Azure AD身份验证从
- .net – SqlConnection的Dispose方法是否会干扰连
- asp.net-mvc – DDD原理和ASP.NET MVC项目设计
- asp.net-mvc – 在哪里提出持久性依赖的域事件 –
- asp.net – Url重写与路由
- 如何在ASP.NET全球化中配置不变文化?
- asp.net-mvc – 如何从ASP.NET MVC VIEWS文件夹访
- asp.net-mvc – Kendo UI Grid一次只扩展一行
