如何使用WindsorContainer在Asp.net MVC中使用两个数据库?

时间:2013-09-09 04:48:36

标签: asp.net-mvc nhibernate castle-windsor

我使用WindsorContainer和Nhibernet进行数据库访问。我使用以下代码在application_start事件上初始化容器,它可以在单个数据库中正常工作。

  Container = new WindsorContainer();
 ControllerBuilder.Current.SetControllerFactory(Container.Resolve<IControllerFactory>());

现在,我想在我的应用程序中使用另一个数据库。请建议我如何用不同的db初始化另一个容器(WindsorContainer)对象。

2 个答案:

答案 0 :(得分:3)

在我的设置中,我有两个数据库,我将其称为“事务性”数据库和“数据仓库”数据库。

我有一个“会话工厂”界面:

public interface ICmsSessionFactory
{
    ISession GetTransactionalSession();
    ISession GetDataWarehouseSession();
    void Release(ISession session);
}

Windsor功能将自动生成一个实现此接口的类。

假设您有两个静态方法CreateTransactionalSessionCreateDataWarehouseSession,您可以注册您的工厂和会话,如下所示:

using Castle.Windsor;
using Castle.Facilities.TypedFactory;
using Castle.MicroKernel.Registration;

// ...

public static void Bootstrap(IWindsorContainer container)
{
    container
        .AddFacility<TypedFactoryFacility>()
        .Register(
                    Component.For<ISession>()
                            .UsingFactoryMethod(() => CreateTransactionalSession())
                            .Named("TransactionalSession")
                            .LifeStyle.PerWebRequest,
                    Component.For<ISession>()
                            .Named("DataWarehouseSession")
                            .UsingFactoryMethod(() => CreateDataWarehouseSession())
                            .LifeStyle.PerWebRequest,
                    Component.For<ICmsSessionFactory>()
                            .AsFactory()
                 );

然后,您可以使ICmsSessionFactory属于需要它们的Controller类的属性。

答案 1 :(得分:1)